2011-06-17 9 views
2

は(Multicast in Pythonから)それからマルチキャストソケットを開き、読みスクリプト重複パケット

import socket 
import struct 

MCAST_GRP = '224.1.1.1' 
MCAST_PORT = 1234 

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) 
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
sock.bind(('', MCAST_PORT)) 
mreq = struct.pack("4sl", socket.inet_aton(MCAST_GRP), socket.INADDR_ANY) 

sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq) 

while True: 
    print sock.recv(10240) 

すべては私が同じスクリプトに平行に実行しない限り、罰金ですがあります2番目のスクリプトを起動した後、別のマルチキャストグループが、ポート同じである、例えば

rtp://224.1.1.1:1234 
rtp://224.1.1.2:1234 

は混乱を開始 - 最初のスクリプトは、第2および第1の第2のパケットを見ます。

私はmcast.pyとしてやってみました - 同様の結果。

どうしてこのようなことが起こり、治癒するのですか?

UPD修正

-sock.bind(('', MCAST_PORT)) 
+sock.bind((MCAST_GRP, MCAST_PORT)) 
+0

明らかに、 'socket'モジュールがスレッドセーフではないという問題がありましたが(http://bugs.python.org/issue1544279)、これはPython 2.5以降で修正されています。 – JAB

+0

今日私はpython3でこのスクリプトを実行しようとしました - 結果は同じです。 – azhurb

+0

Wait ...空のホストにソケットをバインドして後でホストを割り当てると、どのような影響がありますか? – JAB

答えて

2

ポート上のすべての着信接続を聞いたアプリケーションに関係なく、マルチキャストグループメンバーシップを開始したアプリケーション、そのポートにすべてのメッセージを取得しません。これを軽減するには、アドレスタプルの最初の引数をbindに指定して、すべてのアプリケーションがデータを期待しているマルチキャストアドレスをリスンするようにします。

+0

はい、それは今日azhurbが考え出したようです。 – JAB

+0

@JAB私は知っているので、この答えはコミュニティwikiとマークされています。構造化された質問 - 回答形式を維持するのに役立ちます。何かがより良く書けるようになったら、別のコメントを追加するよりもコミュニティのwiki回答を編集する方が良い方法です。 – phihag

+0

ああ、私は理解しています。 – JAB