【问题标题】:Make IPv6 UDP socket on windows to receive from any interface在 Windows 上制作 IPv6 UDP 套接字以从任何接口接收
【发布时间】:2017-05-23 07:57:59
【问题描述】:

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

在 Linux 中,将其绑定到 in6addr_any 就足够了,但在 Windows 中,在您使用 setsockopt() + IPV6_JOIN_GROUP 加入多播组之前,您将不会收到任何多播。在此选项期间必须提供接口索引的问题。但这很不方便。有没有办法从 Windows 中的任何接口接收多播?

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

【问题讨论】:

  • "我想要一个可以接收广播/多播消息的 IPv6 UDP 套接字..." IPv6 没有广播。
  • 我不知道 if_index 0 是否有特殊含义,但可能值得一试...否则您将不得不遍历可用的接口...

标签: windows sockets udp ipv6 multicast


【解决方案1】:

对于 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)

【讨论】:

    猜你喜欢
    • 2012-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    • 2019-09-01
    • 2011-07-03
    • 1970-01-01
    • 2021-04-16
    相关资源
    最近更新 更多