私はtcpdumpを使用してマルチキャストパケットをキャプチャし、tcpdumpがパケットを「参照」できるように、マルチキャストフィードに参加するようにカスタムプログラムをコード化する必要がありました。代わりにnetcatまたは他のアプリケーションがこの機能を実行できるかどうか疑問に思っていますか?
これは、ip maddr add
コマンドを使用して行うことができます。
[〜#〜]構文[〜#〜]
ip maddr [ add | del ] MULTIADDR dev STRING
[〜#〜]説明[〜#〜]
静的リンク層マルチキャストアドレスをアタッチ/デタッチして、インターフェイスでリッスンします。プロトコルマルチキャストグループに静的に参加することはできないことに注意してください。このコマンドは、リンク層アドレスのみを管理します。
address LLADDRESS (default)
the link layer multicast address.
dev NAME
the device to join/leave this multicast address.
[〜#〜]例[〜#〜]
有線接続の例:
ip maddr add ff02::fb dev eth0
ワイヤレス接続の例:
ip maddr add 224.0.0.251 dev wlan0
Socatを使用してグループをサブスクライブできます。これはL2とL3の両方のサブスクリプションでうまく機能します。
socat STDIO UDP4-DATAGRAM:239.101.1.68:8889,\
ip-add-membership=239.0.1.68:10.100.201.1
これは、アドレス239.0.1.68
のインターフェースを使用してグループ10.100.201.1
をサブスクライブします。 UDP4-DATAGRAM:239.101.1.68:8889
ビットは、socatがすべてをstdoutに出力しないようにするために、データを受信してはならないダミーグループおよびudpポートでパケットをリッスンします。代わりに、ペイロードをstdoutに送信する場合は、そのグループとポートを、サブスクライブする実際のグループとポートに変更します。
カンマで区切られた複数のip-add-membership
ディレクティブを指定して、同時に複数のグループをサブスクライブできます。 socatが終了すると、IGMPサブスクリプションもクリアされるようです。
socat
の回答に加えて、重い解決策-- smcroute があります。このアプリケーションはデーモンとして実行され、その場で制御できます。
smcroutectl join eth0 239.1.1.27
smcroutectl leave eth0 239.1.1.27
https://stackoverflow.com/questions/603852/multicast-in-python の「Receive」部分を使用し、MCAST_PORTの定義と行「sock.bind ...」を省略し、最後の行(print ...)をpassに置き換えます。これにより、ダミーのポートを読み取らずに、SOCATの例に似たプログラムが得られます。