我试图通过IPv6向本地网段上的所有节点发送UDP数据包。
我的计算机中有几个网络接口,我想知道如何指定用于发送数据包的网络接口。
我尝试使用socket.sendto (没有绑定)将数据包发送到多播地址ff02::1,但是数据包在错误的网络接口中发送。
知道如何指定网络适配器吗?(我读过关于BINDTODEVICE的文章,但是它不能在windows上工作,有些方法使用绑定来广播IP地址类,但只适用于IPv4)。
谢谢!
发布于 2017-11-14 07:47:08
我不太喜欢以前的解决方案,所以我一直在寻找其他的解决方案。
对我起作用的第一个选项是将发送方套接字绑定到特定的网络接口地址。网络接口地址可以使用netifaces模块找到,我使用这帮助的答案来指定以太网地址。
另一个可行的选择是IPV6_MULTICAST_IF选项-
#x is the relevant interface index
sock.setsockopt(socket.IPPROTO_IPV6,socket.IPV6_MULTICAST_IF,x)在Windows,python2.7中,应该添加行
socket.IPPROTO_IPV6=41在此代码之前(因为相关枚举没有很好地定义)。
其他信息可以找到这里 (Windows)或这里 (Linux)。
虽然这似乎是一个更简单的解决方案,但我没有完全成功地让它工作,也不确定如何找到正确的接口索引(在Windows上,Linux有几种选择)。
发布于 2017-11-05 09:01:49
根据对这问题的回答--多播带ff12::1有时比使用ff02::1的多播更有效。我尝试了它,它成功了--数据包是通过以太网网络接口发送的(如我所愿),而不是像以前那样在WiFi中发送。
然而,我不知道它为什么会起作用,我在IPv6 RFC或互联网上的任何其他地方都找不到它的任何参考资料。欢迎解释:)
发布于 2021-08-21 17:50:16
这是系统配置中的一个问题。操作系统需要配置适当的IPv6路由,以确保数据包在正确的接口上运行。这并不是由应用程序来决定的,就像分配IP地址给网络接口并不是应用程序的工作一样--这都是操作系统的责任。
这是一个答案,它解释了在Linux下是如何做到的。如果有人知道,可以随意添加一个链接,说明它是如何在Windows上完成的。
https://stackoverflow.com/questions/47077323
复制相似问题