通过特定网络接口发送IPv6组播数据包

时间:2017-11-02 14:08:41

标签: python udp ipv6 multicast

我试图通过Windows在python中向本地网段上的所有节点发送IPv6 UDP数据包。

我的计算机中有几个网络接口,我想知道如何指定发送数据包的网络接口。

我尝试使用socket.sendto(没有绑定)将数据包发送到多播地址ff02 :: 1,但数据包是在错误的网络接口中发送的。

知道如何指定网络适配器? (我读到了BINDTODEVICE,但它不适用于Windows,有些方法使用bind来广播IP地址类,但只适用于IPv4)。

谢谢!

2 个答案:

答案 0 :(得分:0)

根据this问题的答案 - 使用ff12 :: 1进行多播有时比使用ff02 :: 1进行多播更有效。 我尝试了它并且它工作 - 数据包通过以太网网络接口(如我所愿)发送,而不是像以前那样在WiFi中发送。

但是,我不知道它为什么会起作用,而且我无法在IPv6 RFC或互联网上的任何其他地方找到任何参考。 欢迎解释:)

答案 1 :(得分:0)

我真的不喜欢以前的解决方案,所以我一直在寻找其他解决方案。

对我有用的第一个选项是将发送方套接字绑定到特定的网络接口地址。可以使用netifaces模块找到网络接口地址,并使用this有用的答案来指定以太网地址。

可能有效的另一个选项是IPV6_MULTICAST_IF选项 -

#x is the relevant interface index
sock.setsockopt(socket.IPPROTO_IPV6,socket.IPV6_MULTICAST_IF,x)

在Windows中,python 2.7,应添加行

socket.IPPROTO_IPV6=41

在此代码之前(因为相关的枚举没有很好地定义)。

可以找到其他信息here(Windows)或here(Linux)。

虽然它似乎是一个更简单的解决方案,但我没有完全设法使其工作,并且不确定找到正确的接口索引的正确方法是什么(在Windows上,Linux有几个选项)。