У меня есть 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
?
Какие параметры вы передаете 'bind'? – dbush
@dbush Я читал некоторые другие сообщения и понял, что мне нужно связать с 'INADDR_ANY', которого я не делал. Я изменил это, но проблема остается. Кажется, что я получаю только при запуске обоих интерфейсов. – en4bz