2016-04-08 4 views
1

У меня есть 2 сетевых интерфейсовUDP многоадресной рассылки с несколькими интерфейсами не работает

 

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 
 

прослушивания для многоадресных пакетов UDP от 224.1.1.1:5007, но пакеты только полученных моей программой при работе на enp5s0 которая случается интерфейсы по умолчанию.

Я использую следующий код, чтобы выбрать интерфейс на основе его IP на основе того, что я читал here. Но, похоже, это не работает.

 

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

Какие параметры вы передаете 'bind'? – dbush

+0

@dbush Я читал некоторые другие сообщения и понял, что мне нужно связать с 'INADDR_ANY', которого я не делал. Я изменил это, но проблема остается. Кажется, что я получаю только при запуске обоих интерфейсов. – en4bz

ответ

0

В многосетевом хосте вам, как правило, необходимо подключиться через все доступные интерфейсы, если вы не знаете, что многоадресные события будут поступать только через один из них. В противном случае сообщение соединения IGMP не переходит ко всем возможным маршрутизаторам.

+0

Хосты подключены через один коммутатор с включенным IGMP Snooping + Querying. Я вижу в таблице IGMP, что оба интерфейса/порты объединены в группы. Поэтому я не думаю, что проблема IGMP. – en4bz

Смежные вопросы