多个接口无法正常工作的UDP组播

时间:2016-04-08 00:53:04

标签: c linux udp multicast

我有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

时才收到数据包

1 个答案:

答案 0 :(得分:0)

在多宿主主机中,您通常需要通过所有可用接口加入,除非您知道多播只能通过其中一个到达。否则,IGMP加入消息不会发送到所有可能的路由器。