2009-04-24 12 views
3

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

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

LANインターフェイスとWANインターフェイスの両方を持つコンピュータでクライアントソフトウェアを実行している場合を除いて、これはうまく動作します。 WANインターフェイスがある場合、マルチキャストは機能しません。明らかに、私はマルチキャストがLAN(eth1)ではなくWANインターフェイス(eth0)に間違って行き来していると考えます。したがって、SO_BINDTODEVICEソケットオプションを使用してマルチキャストソケットでeth1を使用するようにしています。

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

+0

いいえ、カーネルもソケットAPIも自動的にこれを処理しません。人々のプログラムソケットとして役立ついくつかのコードを投稿することができれば。基本的には、各インタフェースを検査し、インターネットでルーティング不可能なIPアドレスを使用しているかどうかを判断する方法があります。あるいは、すべてのインターフェイスを送信することもできます。 – BobbyShaftoe

答えて

4

インターフェイスに明示的にバインドしないと、Linuxはデフォルトのユニキャストルートのインターフェイスをマルチキャスト送信に使用すると考えられます。だから、私の推測では、デフォルトのルートはWANインターフェイス経由であるということです。

リチャードスティーブンスの「Unix Network Programming、Vol.1」第17章(少なくとも第3版)には、ネットワークインタフェースを列挙する方法に関するいくつかの良い情報と例があります。

6

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

Linuxにはマルチキャストルートが必要です。存在しない場合は、EHOSTUNREACHまたはENETUNREACHエラーが発生します。 LCM projectにはこの問題が記録されています。ソケットオプションIP_MULTICAST_IFまたはIPV6_MULTICAST_IFを使用すると、ルーティングはオーバーライドされます。あなたはIPv6アドレスでscope-id field経由でインターフェイスを指定できると思われますが、すべてのプラットフォームがIPv6アドレスを正しくサポートしているわけではありません。 dameissが指摘しているように、StevensのUnixネットワークプログラミングの本はこれらの詳細をカバーしています。あなたはGoogle Booksを介してマルチキャストに関する章のほとんどを無料で閲覧することができます。

関連する問題