web-dev-qa-db-ja.com

Linux組み込みプログラムまたはオープンソースプログラムでマルチキャストグループに参加しますか?

私はtcpdumpを使用してマルチキャストパケットをキャプチャし、tcpdumpがパケットを「参照」できるように、マルチキャストフィードに参加するようにカスタムプログラムをコード化する必要がありました。代わりにnetcatまたは他のアプリケーションがこの機能を実行できるかどうか疑問に思っていますか?

8
chriskirk

これは、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
10
user1686

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サブスクリプションもクリアされるようです。

9
NeilenMarais

socatの回答に加えて、重い解決策-- smcroute があります。このアプリケーションはデーモンとして実行され、その場で制御できます。

smcroutectl join eth0 239.1.1.27
smcroutectl leave eth0 239.1.1.27
1
SergA

https://stackoverflow.com/questions/603852/multicast-in-python の「Receive」部分を使用し、MCAST_PORTの定義と行「sock.bind ...」を省略し、最後の行(print ...)をpassに置き換えます。これにより、ダミーのポートを読み取らずに、SOCATの例に似たプログラムが得られます。

0
Siegfried