Python:获取IPv6套接字以接收发往子网路由器任播地址的数据包子网、路由器、数据包、发往

2023-09-03 14:26:46 作者:过犹不及

如何让套接字接收发往IPv6子网路由器任播地址的数据包?

我找不到有关如何执行此操作的任何信息。

Python全栈日记 Django 五

我试着使用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)

还使用绑定

# socket.error: (99, 'Cannot assign requested address')
s.bind(('fd36:773e:6b4c:47cb::', 9876))

不出所料,这两种方法都没有奏效。有办法做到这一点吗?

推荐答案

而不是IPV6_JOIN_GROUP,请尝试将IPV6_JOIN_ANYCAST传递给s.setsockopt()代码。遗憾的是,Pythonsocket模块没有定义它,但是您应该能够传递等价的整数。在Linux中IPV6_JOIN_ANYCAST27IPV6_LEAVE_ANYCAST28。(在/usr/Include/linux/in6.h中定义)

我能找到的最好的文档来自lkml e-mail describing the anycast patch to the Linux kernel:

加入和离开任播组的应用界面为2 新的setsockopt()调用:IPv6_JOIN_ANYCAST和IPv6_LEVE_ANYCAST。这些论据 与相应的多播操作相同。

愿跳舞的Kame与你同在!