Python Windows不支持';t从所有接口接收多播IPv6数据包

Python Windows不支持';t从所有接口接收多播IPv6数据包,python,windows,network-programming,ipv6,multicast,Python,Windows,Network Programming,Ipv6,Multicast,我正在尝试使用此python 2.7代码在Windows上接收IPv6多播数据包(发送到ff02::1地址)- import socket import win_inet_pton import struct socket.IPPROTO_IPV6=41 #because using python 2.7 on wondows PORT = 1234 UDP_BROADCAST_IPv6 = "ff02::1" sock = socket.socket(socket.AF_INET6,

我正在尝试使用此python 2.7代码在Windows上接收IPv6多播数据包(发送到ff02::1地址)-

import socket
import win_inet_pton
import struct

socket.IPPROTO_IPV6=41  #because using python 2.7 on wondows

PORT = 1234
UDP_BROADCAST_IPv6 = "ff02::1"

sock = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

sock.bind(("",PORT)) # not working with "::" either

# Join multicast group
addrinfo = socket.getaddrinfo(UDP_BROADCAST_IPv6, None)[0]
group = socket.inet_pton(addrinfo[0], addrinfo[4][0])
mreq = group + struct.pack('@I', 0)
sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq)

while True:
    msg=sock.recv(1024)
    print msg
我从另一台通过以太网连接到我的计算机的计算机发送数据包;另外,我的电脑也有WiFi接口。虽然我在使用Wireshark嗅探以太网连接时能够看到相关的数据包,但此代码不会接收到这些数据包

但是,当我禁用WiFi网卡时,会收到数据包。 这让我觉得,虽然启用了WiFi接口,但代码只侦听来自该接口的数据包

我了解到绑定到
应该能够从所有网络接口接收数据包,但由于某些原因,它对我不起作用

有人知道我忘了做什么吗?还是用另一种方法来解决这个问题

谢谢

解决了它:)

因此,显然IPv6不会侦听来自所有接口的多播。这种语法

mreq = group + struct.pack('@I', 0)
他错了。根据,mreq由组id和接口id组成,其中0是默认接口(在我的例子中是WiFi)。为了侦听来自其他接口的多播,应指定网络接口索引

网络接口索引是在运行ipconfig时出现在ipv6地址中
%
后面的数字,也可以在cmd中找到运行“路由打印”的数字

我使用以下代码在python上找到它:

import netifaces as ni
import _winreg as wr # use "winreg" in python3

def get_ethernet_ipv6_ifindex():
    x=ni.interfaces()
    con_names=get_connection_name_from_guid(x)
    ethernet_index= con_names.index('Ethernet')

    addresses= ni.ifaddresses(x[ethernet_index])
    brod_addr=addresses[socket.AF_INET6][-1]["broadcast"]

    return int(brod_addr[brod_addr.find("%")+1:])

"""
Taken from the very helpful https://stackoverflow.com/questions/29913516/how-to-get-meaningful-network-interface-names-instead-of-guids-with-netifaces-un
"""
def get_connection_name_from_guid(iface_guids):
    iface_names = ['(unknown)' for i in range(len(iface_guids))]
    reg = wr.ConnectRegistry(None, wr.HKEY_LOCAL_MACHINE)
    reg_key = wr.OpenKey(reg, r'SYSTEM\CurrentControlSet\Control\Network\{4d36e972-e325-11ce-bfc1-08002be10318}')
    for i in range(len(iface_guids)):
        try:
            reg_subkey = wr.OpenKey(reg_key, iface_guids[i] + r'\Connection')
            iface_names[i] = wr.QueryValueEx(reg_subkey, 'Name')[0]
        except WindowsError:
            pass
    return iface_names
然后-

mreq = group + struct.pack('@I', get_ethernet_ipv6_ifindex())

你的wifi有IPv4吗?还是您的以太网接口?我之所以问这个问题是因为IIRC,python本质上会做
'0.0.0'
,当你做
'
作为监听地址时。默认为IPv4地址。我不确定情况是否如此,但我知道早在IPv6“新”的时候我就遇到了问题:)以太网和WiFi都有IPv4和IPv6。我还尝试绑定到
:“
,但它也不起作用。你最后绑定到了什么地址?我的内存已经不是以前的了,但我想我刚说了f***它,并从接口中删除了IPv4,只是为了隔离问题。早些时候我尝试取消IPv4,但它对我不起作用。我终于找到了解决办法,但非常感谢你的帮助!我试过了,但没用。我没有看到任何IPv6多播数据包。知道为什么吗?