【问题标题】:Send and receive IPv6 link-local multicast UDP datagrams in Python?在 Python 中发送和接收 IPv6 链路本地多播 UDP 数据报?
【发布时间】:2010-07-06 02:44:13
【问题描述】:

以下是简单的 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 代码示例,或对所需常量和地址的生动描述。

【问题讨论】:

标签: python udp posix ipv6 multicast


【解决方案1】:

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

【讨论】:

【解决方案2】:

我目前正在通过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 行中,我看到了“16s15s”的变体,例如“4s”,但我不知道它是什么以及我为我工作的内容!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-05
    • 2012-10-13
    • 1970-01-01
    • 2020-02-21
    • 2021-07-30
    • 1970-01-01
    相关资源
    最近更新 更多