【问题标题】:Python: Getting an IPv6 socket to receive packets destined for the Subnet-Routers Anycast addressPython:获取 IPv6 套接字以接收发往子网路由器任播地址的数据包
【发布时间】:2010-10-10 11:30:55
【问题描述】:

如何获得一个套接字来接收发往 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)

并且还使用绑定

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

正如预期的那样,这些都不起作用。有没有办法做到这一点?

【问题讨论】:

    标签: python networking ipv6


    【解决方案1】:

    尝试将IPV6_JOIN_ANYCAST 传递给您的s.setsockopt() 代码,而不是IPV6_JOIN_GROUP。不幸的是,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。论据 与相应的多播操作相同。

    愿舞蹈与你同在!

    【讨论】:

      【解决方案2】:

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

      如果您希望您的代码可移植,那么您应该以标准方式进行,即将子网路由器任播地址分配给适当的接口,然后将您的套接字绑定到通配符地址并丢弃所有未发送到子网路由器任播地址的内容。请记住,您不应该使用源字段中的任播地址发送数据包,并且您不能在标准套接字 API 中打开只读套接字。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-04-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-06
        • 2012-10-12
        相关资源
        最近更新 更多