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

时间:2009-02-28 00:45:32

标签: 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)

还使用bind

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

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

2 个答案:

答案 0 :(得分:2)

尝试将IPV6_JOIN_GROUP传递给您的IPV6_JOIN_ANYCAST代码,而不是s.setsockopt()。不幸的是,Python socket模块没有定义它,但你应该能够传递等价的整数。在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_LEAVE_ANYCAST。争论 与相应的多播操作相同。

愿舞蹈游戏与你同在!

答案 1 :(得分:0)

IPV6_JOIN_ANYCASTIPV6_LEAVE_ANYCAST套接字选项是非标准Linux主义。

如果您希望您的代码是便携式,那么您应该采用标准方式,即将子网路由器任播地址分配给相应的接口,然后将套接字绑定到通配符解决并丢弃未发送到子网路由器任播地址的所有内容。请记住,您不应该在源字段中发送带有任播地址的数据包,也不能在标准套接字API中打开只读套接字。

在任何合理的操作系统上分配接口地址应该是特权操作,无论你做什么,这都是不标准的部分。如果您必须以编程方式执行此操作,那么它将表示(例如在BSD上)使用SIOCAIFADDR_IN6代码和ioctl()系统调用之类的内容。确保在接口别名请求结构的IN6_IFF_ANYCAST字段中设置ifra_flags标志。