8

2つのNIC(eth0とeth1)を備えたLinuxサーバーがあり、「iproute」でデフォルトとしてeth0を設定しています。ここで、eth1でマルチキャストパケットを受信したいと思います。ルーティングテーブルに「224.0.20.0/24deveth1 proto static scope link」を追加し、次のように接続します。

sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);

// port 12345, adress INADDR_ANY
bind(sock, &bind_addr, sizeof(bind_addr));

// multicast address 224.0.20.100, interface address 10.13.0.7 (=eth1)
setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, &imreq, sizeof(imreq));

それによると、ip maddrそれは正しいインターフェースでそのグループに接続し、tshark -i eth1私が実際にマルチキャストパケットを取得していることを示しています。

ただし、を呼び出すとパケットが届きませんrecvfrom(sock)。「iproutedefault」を(eth0ではなく)eth1に設定すると、recvfromを介してパケットを取得します。これは私のコードまたはネットワーク設定の問題ですか?これを行う正しい方法は何ですか?

(更新)解決策: cafは、これが同じ問題である可能性があることを示唆しました。確かに:実行した後echo 0 > /proc/sys/net/ipv4/conf/eth1/rp_filter、マルチキャストパケットを受信できるようになりました!

4

3 に答える 3

4

これは複数のインターフェースを備えたサーバー(Linux)でマルチキャストを受信することの複製であるというcafのコメントがこれに答えました!(そして、明確にするための答えとしてこれを投稿します。)つまり、echo 0 > /proc/sys/net/ipv4/conf/eth1/rp_filter私の問題は解決します。

于 2011-08-23T08:19:03.437 に答える
2

ネットマスクを追加し、ルーティングテーブルエントリのゲートウェイとして10.13.0.7を指定してみてください。

于 2011-04-12T19:55:40.433 に答える
2

正解です。2つのNICがあり、そのうちの1つだけにデフォルトのgwがあります。

マルチキャストは、ユニキャストルートを使用して、ソースに戻るパスを決定します。つまり、マルチキャストパスがユニキャストパスと異なる場合、マルチキャストパスは終了します。これは、RPFチェックと呼ばれるループ防止メカニズムです。

この場合、NICにバインドされたアプリケーションは事実上IGMPに参加するように強制されましたが、ユニキャストルートはデフォルトゲートウェイを備えた他のNICから学習されました。そのため、チェックは失敗していました。したがって、データはありません。

静的ルートを追加する必要はありません。rp_filterの値を0に変更すると機能するはずです。

于 2015-10-29T21:10:24.647 に答える