代码之家  ›  专栏  ›  技术社区  ›  Shir

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

  •  3
  • Shir  · 技术社区  · 7 年前

    我正在尝试通过Windows,用python将IPv6 UDP数据包发送到本地网段上的所有节点。

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

    谢谢

    3 回复  |  直到 7 年前
        1
  •  1
  •   Malvineous    3 年前

    这是系统配置的问题。操作系统需要配置适当的IPv6路由,以确保数据包在正确的接口上发出。这不是由应用程序来决定的,就像将IP地址分配给网络接口不是应用程序的工作一样,这都是操作系统的责任。

    Here is an answer 这就解释了在Linux下是如何做到这一点的。如果有人知道的话,可以随意添加评论,并链接到Windows上的操作。

        2
  •  0
  •   Shir    7 年前

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

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

        3
  •  0
  •   Shir    7 年前

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

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

    另一个可行的选项是IPV6\u MULTICAST\u 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有几个选项)。