我有一台具有两个NIC(eth0和eth1)的linux服务器,并将eth0设置为“ip route”中的默认值。现在,我想在eth1上接收多播数据包。我在路由表中添加了“224.0.20.0/24 dev eth1原型(prototype)静态作用域链接”,并按如下方式进行连接:

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,它连接到右侧接口(interface)上的该组,并且tshark -i eth1显示我实际上正在获取多播数据包。

但是,调用recvfrom(sock)时没有收到任何数据包。如果我将“ip route default”设置为eth1(而不是eth0),则确实会通过recvfrom获取数据包。我的代码或网络设置是否有此问题,正确的方法是什么?

(更新)解决方案: caf暗示this可能是同一问题;确实:做完echo 0 > /proc/sys/net/ipv4/conf/eth1/rp_filter之后,我现在可以接收多播数据包了!

最佳答案

caf的评论,它是receiving multicast on a server with multiple interfaces (linux)的重复,回答了这个问题! (为了清楚起见,我将其发布为答案。)即,echo 0 > /proc/sys/net/ipv4/conf/eth1/rp_filter解决了我的问题。

09-09 22:48