tcmpdumpがeth2の上で特定のグループおよびポートへのすべてのマルチキャストトラフィックを表示することができ、特定のインターフェイス上でマルチキャストデータを受信するが、私のPythonプログラムはできません。 Ubuntuの12.04で実行されているPythonプログラム、:は
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
それは別のプログラムから、私が送るパケットと現在のすべてのマルチキャストトラフィックの両方を見ています。それはこのように見える出力です...
なぜ私のプログラムは外部からのパケットを見ることができませんか?これを修正するにはどうすればいいですか?
編集:
私が言及している必要があり、これはオーバー行くインターフェイスはVLANないeth2
けどeth2.200
です。 (ローカルIPとのtcpdumpコマンドは、私はこの質問には、それを簡単にすることに変更し、eth2.200
を持つすべての実行されます。)問題がある可能性がthis answerに基づいて?
編集#2:
netstat -ng
プログラムが224.0.0.1と6.7.8.9`に加入してショーをeth2.200
実行されています。
tshark -i eth2.200 igmp
は、プログラムの最初の起動時に3が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