在Python中发送和接收IPv6链路本地多播UDP数据报?

时间:2010-07-06 02:44:13

标签: python udp posix ipv6 multicast

以下是简单的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数据包发送到正在使用的组的多播地址。
  4. 进一步的信息我可能需要绑定到多个接口,并告诉套接字使用setsockopt()它还应该接收多播数据包。最后,getaddrinfo()可以全面使用,以优雅地“退回”到无法使用IPv6的IPv4。

    我已经实现了很多,但主要是在多播部分上绊倒。 Python中的完整代码示例,或者对所需常量和地址的生动描述是首选。

2 个答案:

答案 0 :(得分:1)

这是指向python mcast demo的链接,包括IPv4和IPv6。

答案 1 :(得分:0)

我目前正在通过here提一个问题,涉及获取收到消息的多播地址,但是源代码回答了您的问题!

要收听:

# 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”变体,但是我不知道它是什么以及为我工作的是什么!