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

Sending IPv6 multicast packets through a specific network interface

我正在尝试通过 Windows.

将 IPv6 UDP 数据包发送到 python 本地网段上的所有节点

我的电脑有几个网络接口,我想知道如何指定发送数据包的网络接口。

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

知道如何指定网络适配器吗? (我阅读了有关 BINDTODEVICE 的信息,但它不适用于 windows,一些使用绑定广播 IP 地址的方法 类,但仅适用于 IPv4)。

谢谢!

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

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

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

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

另一个可能有效的选项是 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) or here (Linux)。

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

这是您系统配置的问题。操作系统需要配置正确的 IPv6 路由,以确保数据包从正确的接口发出。这不是由应用程序决定的,类似于为网络接口分配 IP 地址不是应用程序的工作——这完全是 OS.

的责任。

Here is an answer 解释了如何在 Linux 下完成此操作。如果有人知道,请随时添加带有 link 的评论,说明它是如何在 Windows 上完成的。