我有2个网络接口
enp5s0 Link encap:Ethernet HWaddr d8:cb:8a:c3:4d:61
inet addr:192.168.1.3 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::dacb:8aff:fec3:4d61/64 Scope:Link
inet6 addr: 2607:fa48:6d42:4230::1003/128 Scope:Global
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
ens6 Link encap:Ethernet HWaddr a0:36:9f:57:0b:ac
inet addr:192.168.1.5 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::a236:9fff:fe57:bac/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
侦听来自224.1.1.1:5007
的UDP多播数据包,但只有我的程序在enp5s0
上运行时才接收数据包,这恰好是默认接口。
我使用以下代码根据我的内容here选择基于IP的接口。但它似乎不起作用。
struct ip_mreq mc_addr = {};
mc_addr.imr_multiaddr.s_addr = inet_addr("224.1.1.1");
mc_addr.imr_interface.s_addr = inet_addr(argv[1]);
int rv = setsockopt(s, IPPROTO_IP, IP_MULTICAST_IF, &mc_addr.imr_interface, sizeof(mc_addr.imr_interface));
if(rv < 0) {
perror("IP_MULTICAST_IF");
}
rv = setsockopt(s, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mc_addr, sizeof(mc_addr));
if(rv < 0) {
perror("IP_ADD_MEMBERSHIP");
}
如果我使用enp5s0
一切正常,但在使用ens6
时,即使我可以在我的交换机和wireshark上看到活动,我也什么也得不到。更令人困惑的是,如果我开始我的程序两次,每个程序运行一个接口,每个程序都接收数据包。
那么为什么我的程序在仅使用ens6
?
答案 0 :(得分:0)
在多宿主主机中,您通常需要通过所有可用接口加入,除非您知道多播只能通过其中一个到达。否则,IGMP加入消息不会发送到所有可能的路由器。