如何在多宿主服务器的非默认接口上接收多播数据

时间:2011-04-04 14:52:43

标签: sockets udp multicast multihomed

我有一个带有两个NIC(eth0和eth1)的linux服务器,并且在“ip route”中将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获取数据包。这是我的代码或我的网络设置的问题,这是做什么的正确方法?

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

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

尝试添加网络掩码并在路由表条目中指定10.13.0.7作为网关。

答案 2 :(得分:2)

正确,假设您有两个NIC,其中只有一个默认gw。

Multicast使用单播路由来确定返回源的路径。这意味着,如果组播路径与单播路径不同,则组播路径将退出。这是一种称为RPF检查的循环预防机制。

在这种情况下,有效绑定到NIC的应用程序被强制加入IGMP,因为单播路由是从具有默认网关的另一个NIC获知的。所以检查失败了。因此没有数据。

您无需添加任何静态路由。它应该在您将rp_filter值更改为0时起作用。