TLDR:有没有办法使用“ip route”为多个 NIC 添加多播路由?
我们的软件使用两个多播组与两个不同物理网络上的两组不同设备进行通信。除此应用程序外,一个网络上的设备无需通过我们的设备进行通信即可与另一个网络上的设备进行通信。
为此,软件会创建两个套接字。每个都绑定到单独 NICS 的 IP 地址之一。然后,该套接字加入到该网络上存在的多播组,例如,套接字 1 绑定到 192.168.0.2 并加入多播组 233.255.10.1,而套接字 2 绑定到 10.57.31.2 并加入多播组 239.255.100.1。
我们目前正在使用 bash 脚本(Linux 内核 3.14.39)使用路由在两个网络接口上设置多播路由,例如
route add -net 224.0.0.0 netmask 240.0.0.0 eth0
route add -net 224.0.0.0 netmask 240.0.0.0 eth1
并通过 route -n 验证
Destination Gateway Genmask Flags Metric Ref Use Iface
224.0.0.0 0.0.0.0 240.0.0.0 U 0 0 0 eth0
224.0.0.0 0.0.0.0 240.0.0.0 U 0 0 0 eth1
我最近读到该路由已弃用/过时,我们应该使用 ip route 代替,例如
ip route add 224.0.0.0/4 dev eth0
ip route add 224.0.0.0/4 dev eth1
不幸的是,第二次调用失败并显示“RTNETLINK 答案:文件存在”,当然,在这些调用之后,第二条路由不会出现。
有没有办法使用 ip route 向多个 NIC 添加多播路由?
我可以使用 /8 作为网络掩码吗?例如
ip route add 233.0.0.0/8 dev eth0
和
ip route add 239.0.0.0/8 dev eth1
但这是有问题的,因为执行此操作的脚本不知道哪个多播地址与哪个设备相关联,并且根据系统配置,它并不总是保证相同。使用我的第一个路由添加示例使这不是问题。
更新 感谢与@Ron Maupin 的广泛讨论,我意识到错误出现在我们的代码中。我们没有使用 IP_MULTICAST_IF 设置用于多播的接口。添加 setsockopt 调用以设置 IP_MULTICAST_IF 后,我不再需要添加路由表。
struct in_addr multicastInterface = {};
multicastInterface.s_addr = interfaceAddressNetworkOrder;
// Set which outgoing interface to use
int result = setsockopt(m_socket, IPPROTO_IP, IP_MULTICAST_IF, (char*)&multicastInterface, sizeof(struct in_addr));