3

Debian 4 を実行している約 40 ノードのクラスターで作業しています。各ノードは、マルチキャスト IP に座ってリッスンするデーモンを実行します。

クラスターと同じスイッチ上のクライアント コンピューターを使用して、LAN 経由でマルチキャストを送信するクライアント ソフトウェアを作成し、クラスター内の各ノードがパケットを受信して​​応答するようにしました。

LAN と WAN の両方のインターフェイスを備えたコンピューターでクライアント ソフトウェアを実行する場合を除いて、うまく機能します。WAN インターフェイスがある場合、マルチキャストは機能しません。したがって、明らかに、マルチキャストは LAN (eth1) ではなく、WAN インターフェース (eth0) を介して誤って送信されていると考えられます。したがって、SO_BINDTODEVICE ソケット オプションを使用して、マルチキャスト ソケットが eth1 を使用するように強制しました。すべて問題ありません。

しかし、カーネルのルーティング テーブルは、LAN (eth1) が明らかにマルチキャストの低コストの宛先であることを判断する必要があると考えました。ソケットが eth1 を使用するよう明示的に強制しなければならない理由はありますか? また、特定のインターフェイスが LAN か WAN かをアプリケーションに自動的に判断させる方法 (おそらく ioctl 呼び出し) はありますか?

4

2 に答える 2

6

インターフェイスに明示的にバインドしない場合、Linux はマルチキャスト送信用のデフォルトのユニキャスト ルートにインターフェイスを使用していると思います。

Linux にはマルチキャスト ルートが必要です。存在しない場合は、EHOSTUNREACH または ENETUNREACH エラーが発生します。LCM プロジェクトは、この考えられる問題を文書化しています。ソケット オプション IP_MULTICAST_IF または IPV6_MULTICAST_IF を使用すると、ルーティングは上書きされます。IPv6 アドレスのスコープ ID フィールドを介してインターフェイスを指定できるはずですが、すべてのプラットフォームが適切にサポートしているわけではありません。dameiss が指摘しているように、Stevens の Unix Network Programming の本でこれらの詳細が説明されており、マルチキャストに関する章のほとんどは Google Books から無料で閲覧できます。

于 2010-02-06T04:44:41.733 に答える