使windows上的IPv6 UDP套接字从任何接口接收
我想要一个IPv6 UDP套接字,它可以使用链接本地地址从任何本地接口接收广播/多播消息 在Linux中,将其绑定到in6addr_any就足够了,但在Windows中,只有使用setsockopt()+IPV6_join_group加入多播组,您才能接收到任何多播。此选项期间必须提供接口索引的问题。但这是不方便的。是否有一种方法可以从Windows中的任何接口接收多播使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,网络接口的索引由方
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是否有特殊含义,但可能值得一试。。。否则,您将不得不在可用接口上循环。。。