8

我有一个带有两个 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 暗示可能是同一个问题;确实:这样做之后,echo 0 > /proc/sys/net/ipv4/conf/eth1/rp_filter我现在可以接收多播数据包了!

4

3 回答 3

4

caf的评论说这是在具有多个接口(linux)的服务器上接收多播的重复回答了这个!(为了清楚起见,我将其发布为答案。)也就是说,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

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

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

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

您不需要添加任何静态路由。当您将 rp_filter 值更改为 0 时,它应该可以正常工作。

于 2015-10-29T21:10:24.647 回答