我有一个linux服务器,有两个网卡(eth0和eth1),并在"ip路由"中将eth0设置为默认值。现在我想在eth1上接收多播数据包。我在路由表中添加了"224.0.20.0/24 dev eth1 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)
时没有收到任何数据包。如果我将"ip route default"设置为eth1(而不是eth0),我将通过recvfrom获得数据包。这是我的代码问题还是我的网络设置问题,正确的方法是什么?
(update) solution: caf暗示这可能是同样的问题;的确:在做了echo 0 > /proc/sys/net/ipv4/conf/eth1/rp_filter
之后,我现在可以接收多播数据包了!
caf的评论,这是一个重复的接收多播服务器与多个接口(linux)回答了这个问题!(我把这篇文章贴出来是为了澄清问题。)也就是说,echo 0 > /proc/sys/net/ipv4/conf/eth1/rp_filter
解决了我的问题。
尝试添加一个netmask并在路由表条目中指定10.13.0.7作为网关。
正确,假设您有两个网卡,其中只有一个网卡上有默认gw。
多播使用单播路由确定返回源的路径。这意味着,如果组播路径与单播路径不同,则组播路径将退出。这是一种循环预防机制,称为RPF检查。
在这种情况下,绑定到网卡的应用程序实际上被强制加入IGMP,因为单播路由是从具有默认网关的另一个网卡学习的。所以检查失败了。因此没有数据。
不需要添加任何静态路由。当您将rp_filter值更改为0时,它应该可以正常工作。