【发布时间】:2012-11-30 11:02:42
【问题描述】:
tcmpdump 可以查看到 eth2 上特定组和端口的所有多播流量,但我的 Python 程序不能。 Python 程序,在 Ubuntu 12.04 上运行:
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# Multicast port is 52122
sock.bind(('', 52122))
# Interface eth2 IP is 1.2.3.4, multicast group is 6.7.8.9
mreq = socket.inet_aton('6.7.8.9')+socket.inet_aton('1.2.3.4')
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
while True:
print '\nwaiting to receive message'
data, address = sock.recvfrom(1024)
print data
当我使用另一个程序向 eth2 发送多播数据包时,它会工作并打印数据包。但它看不到所有当前的多播流量。如果我在与上述程序相同的端口和组上的 eth2 上运行 tcpdump:
sudo tcpdump -i eth2 host 6.7.8.9 and port 52122
它可以看到我从另一个程序发送的数据包和所有当前的多播流量。它的输出看起来像这样......
# Packet sent from my other program
09:52:51.952714 IP 1.2.3.4.57940 > 6.7.8.9.52122: UDP, length 19
# Packet send from the outside world
09:52:52.143339 IP 9.9.9.9.39295 > 6.7.8.9.52122: UDP, length 62
为什么我的程序看不到来自外界的数据包?我怎样才能修改它(或其他东西)来解决这个问题?
编辑:
我应该提到,这个经过的接口不是eth2,而是eth2.200一个VLAN。 (本地 IP 和 tcpdump 命令都使用eth2.200 运行,我只是在这个问题中更改了它以使其更简单。)基于this answer 这可能是问题吗?
编辑#2:
netstat -ng 程序运行时显示eth2.200 订阅了 224.0.0.1 和 6.7.8.9`。
tshark -i eth2.200 igmp 在程序第一次启动时显示三个重复的1.2.3.4 -> 6.7.8.9 IGMP 46 V2 Membership Report / Join group 6.7.8.9。当程序进程被杀死时,它显示1.2.3.4 -> 224.0.0.2 IGMP 46 V2 Leave group 6.7.8.9。还有一个不常见的1.2.3.1 -> 224.0.0.1 IGMP 60 V2 Membership Query, general,其中1.2.3.1是1.2.3.4的网关。
不确定是否有帮助,但路由表如下所示:
Destination Gateway Genmask Flags MSS Window irtt Iface
0.0.0.0 1.2.5.6 0.0.0.0 UG 0 0 0 eth1
1.2.3.0 0.0.0.0 255.255.255.240 U 0 0 0 eth2.200
谢谢!
【问题讨论】:
-
运行程序时
netstat -ng会说什么? -
您不需要
struct.pack("=4sl", ...)上的mreq吗?参考:UdpCommunication. -
@NikolaiNFetissov:运行时,在 eth2 下,它列出:
eth2 1 23.13.16.41、eth2 2 6.7.8.9、eth2 1 224.0.0.1。 23.13.16.41 是我不久前尝试订阅的另一个组。 -
@Steve-o:我也用过,没区别。
-
@Albeit 当您启动您的 python 应用程序时,您是否看到 IGMP 加入消息通过 eth2 发出?
标签: python sockets multicast packet tcpdump