如何让套接字接收发往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)
还使用bind
# socket.error: (99, 'Cannot assign requested address')
s.bind(('fd36:773e:6b4c:47cb::', 9876))
正如所料,这些都没有奏效。有没有办法做到这一点?
答案 0 :(得分:2)
尝试将IPV6_JOIN_GROUP
传递给您的IPV6_JOIN_ANYCAST
代码,而不是s.setsockopt()
。不幸的是,Python socket
模块没有定义它,但你应该能够传递等价的整数。在Linux中,IPV6_JOIN_ANYCAST
为27
,IPV6_LEAVE_ANYCAST
为28
。 (在/usr/include/linux/in6.h中定义)
我能找到的最佳文档来自lkml e-mail describing the anycast patch to the Linux kernel:
加入和离开任播组的应用程序界面为2 新的setsockopt()调用:IPV6_JOIN_ANYCAST和IPV6_LEAVE_ANYCAST。争论 与相应的多播操作相同。
愿舞蹈游戏与你同在!
答案 1 :(得分:0)
IPV6_JOIN_ANYCAST
和IPV6_LEAVE_ANYCAST
套接字选项是非标准Linux主义。
如果您希望您的代码是便携式,那么您应该采用标准方式,即将子网路由器任播地址分配给相应的接口,然后将套接字绑定到通配符解决并丢弃未发送到子网路由器任播地址的所有内容。请记住,您不应该在源字段中发送带有任播地址的数据包,也不能在标准套接字API中打开只读套接字。
在任何合理的操作系统上分配接口地址应该是特权操作,无论你做什么,这都是不标准的部分。如果您必须以编程方式执行此操作,那么它将表示(例如在BSD上)使用SIOCAIFADDR_IN6
代码和ioctl()
系统调用之类的内容。确保在接口别名请求结构的IN6_IFF_ANYCAST
字段中设置ifra_flags
标志。