Rea*_*nly 5 python networking ipv6
如何获得套接字接收发往IPv6子网路由器任播地址的数据包?
我无法找到有关如何执行此操作的任何信息.
在一个解决方案中,我尝试使用socket.setsockopt,就像加入多播组一样:
# 7 is the interface number
s = socket(AF_INET6, SOCK_DGRAM)
packed_iface_num = struct.pack("I", 7)
group = inet_pton(AF_INET6, 'fd36:d00d:d00d:47cb::') + packed_iface_num
# socket.error: (22, 'Invalid argument')
s.setsockopt(IPPROTO_IPV6, IPV6_JOIN_GROUP, group)
Run Code Online (Sandbox Code Playgroud)
并且还使用bind
# socket.error: (99, 'Cannot assign requested address')
s.bind(('fd36:773e:6b4c:47cb::', 9876))
Run Code Online (Sandbox Code Playgroud)
正如所料,这些都没有奏效.有没有办法做到这一点?
而不是IPV6_JOIN_GROUP,请尝试传递IPV6_JOIN_ANYCAST给您的s.setsockopt()代码。不幸的是,Pythonsocket模块没有定义它,但您应该能够传递等效的整数。在 Linux 中IPV6_JOIN_ANYCAST是27并且IPV6_LEAVE_ANYCAST是28。(在 /usr/include/linux/in6.h 中定义)
我能找到的最好的文档来自这封lkml 电子邮件,描述了 Linux 内核的任播补丁:
用于加入和离开任播组的应用程序接口是 2 个新的 setsockopt() 调用:IPV6_JOIN_ANYCAST 和 IPV6_LEAVE_ANYCAST。参数与相应的组播操作相同。
愿舞蹈与你同在!