【发布时间】:2018-06-14 02:13:13
【问题描述】:
我正在尝试为 Python 中的 IPv6 多播通信设计一个简单的客户端/服务器对。到目前为止,我的代码似乎符合我在网上看到的示例,但我的服务器从未接收到数据。
我在ip maddr show 和netstat -g 中看到了订阅。 tcpdump 显示:10:13:36.913546 IP6 (flowlabel 0x77fe8, hlim 5, next-header UDP (17) payload length: 20) **omitted** > ff16::fe.commplex-main: [udp sum ok] UDP, length 12
客户端和服务器连接到同一个交换机,并且 IPv6 单播地址在同一个子网中(它们可以相互 ping 通)。
服务器
#!/usr/bin/python3
import socket
import struct
local_addr = ::
mcast_addr = "ff16::fe"
mcast_port = 5000
ifn = "eno1"
# Create socket
sock = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
# Set multicast interface
ifi = socket.if_nametoindex(ifn)
ifis = struct.pack("I", ifi)
sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, ifis)
# Set multicast group to join
group = socket.inet_pton(socket.AF_INET6, mcast_addr) + ifis
sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, group)
sock_addr = socket.getaddrinfo(local_addr, mcast_port, socket.AF_INET6, socket.SOCK_DGRAM)[0][4]
sock.bind(sock_addr)
cmd = ""
while True:
data, src = sock.recvfrom(1024)
print("From " + str(src) + ": " + data.decode())
客户
#!/usr/bin/python3
import socket
import struct
message = "Hello world!"
sock = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
sock_addr = socket.getaddrinfo("ff16::fe", 5000, socket.AF_INET6, socket.SOCK_DGRAM)[0][4]
ttl = struct.pack('i', 5)
sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, ttl)
sock.sendto(message.encode(), sock_addr)
我们将不胜感激。
【问题讨论】:
-
客户端和服务器是否在同一个网络上?组播数据包不能通过 Internet 路由。
-
客户端和服务器在同一个网络。
-
"客户端和服务器在同一个网络上。" 那么你应该使用 Link-Local 范围:
ff12::fe。您似乎仍然错误地计算了 UDP 校验和。 "UDP 与 IPv4 和 IPv6 的使用之间的主要区别在于,由于缺少 IPv6 标头校验和,RFC 2460 要求使用计算的 UDP 校验和,即非零值。包含伪校验和计算中的标头提供了数据报是否已传送到预期的 IPv6 目标节点的统计检查。[RFC1071] 中描述了校验和计算的算法。" -
在这种情况下,未分配的范围是否应该与链接本地范围一样工作?就 UDP 校验和而言,我的代码中还需要为此做什么?
-
根据 RFC,您应该能够使用未分配的范围,但我不会,因为它可能会在某些时候被重新定义,例如,直到这个 RFC,Realm-Local 未被分配,现在您在尝试使用该范围时可能会遇到麻烦。 Admin-Local 非常适合您自己使用。
标签: python python-3.x ipv6 multicast