1

現在、マルチキャストデータを受信する次のコードがあります。

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

ネットワークカードを2枚持っていますが、コードは127.0.0.1に送信されたメッセージのみをリッスンします。ネットワークカード上のすべてのマルチキャストメッセージを聞くにはどうすればよいですか?それらをハードコーディングせずに。

4

2 に答える 2

3

struct ip_mreq目的のマルチキャストグループに参加するインターフェイスを1つ選択できます。指定INADDR_ANYすると、システムはルーティングテーブルで一致するルート上のインターフェイスを検索することでそれを実行できます(つまり、すべてのインターフェイスではなく、任意のインターフェイスを意味ます。Unixを使用している場合は、を使用してグループメンバーシップに選択されているインターフェイスを確認できます。netstat -ng

すべてのインターフェイスで同じグループに参加する場合は、それらを列挙しif_nameindex(3)(Pythonでこれを行う方法を理解する必要があります)、インターフェイスごとにソケットを作成し、インターフェイスのインデックスまたはアドレスを使用してグループbind(2)に参加( )します。 setsockopt(2)、次にソケットを。でポーリングしselectます。

于 2013-01-07T19:39:37.227 に答える
2
  1. UDPソケットには「リスニング」はありません。これはTCP用語です。該当するすべてのインターフェイスを介して、それらをループすることにより、マルチキャストグループに参加する必要があります。これにより、IGMP JOINメッセージが必要なすべてのネットワークに確実に送信されるため、ネットワークはマルチキャストを送信することを認識します。

  2. プラットフォームに応じて、マルチキャストアドレス自体(Linux)またはINADDR_ANY = 0.0.0.0(Windows)のいずれかにバインドする必要があります。Unixがどのキャンプに該当するかはわかりませんが、この場合はWindowsキャンプだと思います。これにより、任意のインターフェイスを介してデータグラムを受信できるようになります。

于 2013-01-07T22:07:19.167 に答える