6

下面是一个简单的 IPv4 UDP 广播,然后监听所有接口。

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, True)
sock.bind(("", 1337))
sock.sendto("hello world", ("255.255.255.255", 1337))
while True:
    data, addr = sock.recvfrom(0x100)
    print "received from {0}: {1!r}".format(addr, data)

我想调整它以发送和接收 IPv4 和 IPv6。

我已经四处寻找并尽可能多地阅读,并相信以下大致是我需要采取的路线:

  1. 创建一个 IPv6 套接字。
  2. 将套接字添加到链接或站点本地多播组。
  3. 将 UDP 数据包发送到正在使用的组的多播地址。

我得到的进一步信息是我可能需要绑定到几个接口,并告诉使用它的套接字setsockopt()它也应该接收多播数据包。最后getaddrinfo(),可以全面使用以优雅地“退回”到 IPv6 不可用的 IPv4。

我已经实现了很多,但主要是在多播部分上偶然发现。最好有完整的 Python 代码示例,或对所需常量和地址的生动描述。

4

2 回答 2

3

这是python mcast demo的链接,同时支持 IPv4 和 IPv6。

于 2010-08-13T02:15:32.813 回答
0

我目前在这里问一个问题,涉及获取接收到的消息的多播地址,但源代码回答了你的问题!

聆听:

# Initialise socket for IPv6 datagrams
sock = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM, socket.IPPROTO_UDP)

# Allows address to be reused
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

# Binds to all interfaces on the given port
sock.bind(('', 8080))

# Allow messages from this socket to loop back for development
sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_LOOP, True)

# Construct message for joining multicast group
mreq = struct.pack("16s15s".encode('utf-8'), socket.inet_pton(socket.AF_INET6, "ff02::abcd:1"), (chr(0) * 16).encode('utf-8'))
sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq)

data, addr = sock.recvfrom(1024)

并发送:

# Create ipv6 datagram socket
sock = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
# Allow own messages to be sent back (for local testing)
sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_LOOP, True)
sock.sendto("hello world".encode('utf-8'), ("ff02::abcd:1", 8080))

这适用于 python3.6,对于 python 2.7,我认为编码是不必要的。同样在 struct.pack 行中,我看到了诸如“4s”之类的“16s15s”的变体,但我不知道它是什么以及我为我工作了什么!

于 2018-11-26T20:09:42.220 回答