Python:获取IPv6套接字以接收发往Subnet-Routers任播地址的数据包

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)

正如所料,这些都没有奏效.有没有办法做到这一点?

joe*_*ker 2

而不是IPV6_JOIN_GROUP,请尝试传递IPV6_JOIN_ANYCAST给您的s.setsockopt()代码。不幸的是,Pythonsocket模块没有定义它,但您应该能够传递等效的整数。在 Linux 中IPV6_JOIN_ANYCAST27并且IPV6_LEAVE_ANYCAST28。(在 /usr/include/linux/in6.h 中定义)

我能找到的最好的文档来自这封lkml 电子邮件,描述了 Linux 内核的任播补丁

用于加入和离开任播组的应用程序接口是 2 个新的 setsockopt() 调用:IPV6_JOIN_ANYCAST 和 IPV6_LEAVE_ANYCAST。参数与相应的组播操作相同。

愿舞蹈与你同在!