Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使windows上的IPv6 UDP套接字从任何接口接收_Windows_Sockets_Udp_Ipv6_Multicast - Fatal编程技术网

使windows上的IPv6 UDP套接字从任何接口接收

使windows上的IPv6 UDP套接字从任何接口接收,windows,sockets,udp,ipv6,multicast,Windows,Sockets,Udp,Ipv6,Multicast,我想要一个IPv6 UDP套接字,它可以使用链接本地地址从任何本地接口接收广播/多播消息 在Linux中,将其绑定到in6addr_any就足够了,但在Windows中,只有使用setsockopt()+IPV6_join_group加入多播组,您才能接收到任何多播。此选项期间必须提供接口索引的问题。但这是不方便的。是否有一种方法可以从Windows中的任何接口接收多播 UPD:对于IPv4,我使用目标地址ff02::1(所有节点地址),网络接口的索引是IP地址;对于IPv6,网络接口的索引由方

我想要一个IPv6 UDP套接字,它可以使用链接本地地址从任何本地接口接收广播/多播消息

在Linux中,将其绑定到in6addr_any就足够了,但在Windows中,只有使用setsockopt()+IPV6_join_group加入多播组,您才能接收到任何多播。此选项期间必须提供接口索引的问题。但这是不方便的。是否有一种方法可以从Windows中的任何接口接收多播


UPD:对于IPv4,我使用目标地址ff02::1(所有节点地址)

,网络接口的索引是IP地址;对于IPv6,网络接口的索引由方法
socket.getaddrinfo
返回

下面的代码显示了如何在所有网络接口上侦听多播:

from socket import AF_INET6, AF_INET
import socket
import struct

# Bugfix for Python 3.6 for Windows ... missing IPPROTO_IPV6 constant
if not hasattr(socket, 'IPPROTO_IPV6'):
    socket.IPPROTO_IPV6 = 41

multicast_address = {
    AF_INET: ["224.0.1.187"],
    AF_INET6: ["FF00::FD"]
}
multicast_port = 5683

addr_info = socket.getaddrinfo('', None)  # get all ip
for addr in addr_info:
    family = addr[0]
    local_address = addr[4][0]

    sock = socket.socket(family, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    sock.bind((local_address, multicast_port))
    if family == AF_INET:
        for multicast_group in multicast_address[family]:
            sock.setsockopt(
                socket.IPPROTO_IP,
                socket.IP_ADD_MEMBERSHIP,
                socket.inet_aton(multicast_group) + socket.inet_aton(local_address)
            )
    elif family == AF_INET6:
        for multicast_group in multicast_address[family]:
            ipv6mr_interface = struct.pack('i', addr[4][3])
            ipv6_mreq = socket.inet_pton(socket.AF_INET6, multicast_group) + ipv6mr_interface
            sock.setsockopt(
                socket.IPPROTO_IPV6,
                socket.IPV6_JOIN_GROUP,
                ipv6_mreq
            )
# _transport, _protocol = await loop.create_datagram_endpoint(
#     lambda: protocol_factory(), sock=sock)

对于IPv4,网络接口的索引是IP地址;对于IPv6,网络接口的索引由方法
socket.getaddrinfo
返回

下面的代码显示了如何在所有网络接口上侦听多播:

from socket import AF_INET6, AF_INET
import socket
import struct

# Bugfix for Python 3.6 for Windows ... missing IPPROTO_IPV6 constant
if not hasattr(socket, 'IPPROTO_IPV6'):
    socket.IPPROTO_IPV6 = 41

multicast_address = {
    AF_INET: ["224.0.1.187"],
    AF_INET6: ["FF00::FD"]
}
multicast_port = 5683

addr_info = socket.getaddrinfo('', None)  # get all ip
for addr in addr_info:
    family = addr[0]
    local_address = addr[4][0]

    sock = socket.socket(family, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    sock.bind((local_address, multicast_port))
    if family == AF_INET:
        for multicast_group in multicast_address[family]:
            sock.setsockopt(
                socket.IPPROTO_IP,
                socket.IP_ADD_MEMBERSHIP,
                socket.inet_aton(multicast_group) + socket.inet_aton(local_address)
            )
    elif family == AF_INET6:
        for multicast_group in multicast_address[family]:
            ipv6mr_interface = struct.pack('i', addr[4][3])
            ipv6_mreq = socket.inet_pton(socket.AF_INET6, multicast_group) + ipv6mr_interface
            sock.setsockopt(
                socket.IPPROTO_IPV6,
                socket.IPV6_JOIN_GROUP,
                ipv6_mreq
            )
# _transport, _protocol = await loop.create_datagram_endpoint(
#     lambda: protocol_factory(), sock=sock)

“我想拥有一个可以接收广播/多播消息的IPv6 UDP套接字…”IPv6没有广播。我不知道索引0是否有特殊含义,但可能值得一试。。。否则,您将不得不在可用接口上循环…“我希望有一个可以接收广播/多播消息的IPv6 UDP套接字…”IPv6没有广播。我不知道索引0是否有特殊含义,但可能值得一试。。。否则,您将不得不在可用接口上循环。。。