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
、マルチキャストパケットを受信できるようになりました!