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'说了什么? –
你不需要'mreq'上的struct.pack(“= 4sl”,...)吗?参考文献:[UdpCommunication](http://wiki.python.org/moin/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是我不久前试图订阅的另一个小组。 – Albeit