以下是简单的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。
我已经四处寻找并尽可能多地阅读,并且相信以下内容大致是我需要采取的路线:
进一步的信息我可能需要绑定到多个接口,并告诉套接字使用setsockopt()
它还应该接收多播数据包。最后,getaddrinfo()
可以全面使用,以优雅地“退回”到无法使用IPv6的IPv4。
我已经实现了很多,但主要是在多播部分上绊倒。 Python中的完整代码示例,或者对所需常量和地址的生动描述是首选。
答案 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”变体,但是我不知道它是什么以及为我工作的是什么!