arbeiten habe ich 2 NetzwerkschnittstellenUDP-Multicast mit mehreren Schnittstellen nicht
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
für UDP Multicast-Pakete von 224.1.1.1:5007
hören aber Pakete werden nur durch mein Programm empfangen werden, wenn auf enp5s0
ausgeführt, die die Standard-Schnittstellen sein geschieht.
Ich verwende den folgenden Code, um die Schnittstelle basierend auf der IP basierend auf dem, was ich gelesen habe here auszuwählen. Aber es scheint nicht zu funktionieren.
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");
}
Wenn ich enp5s0
funktioniert alles einwandfrei verwenden, aber bei der Verwendung von ens6
erhalte ich nichts, obwohl ich Tätigkeit auf meinem Schalter und in wireshark sehen. Noch verwirrender ist, dass, wenn ich mein Programm zweimal mit jeweils einer Schnittstelle starte, beide Programme Pakete empfangen.
Warum empfängt mein Programm keine Pakete, wenn nur ens6
verwendet wird?
Welche Parameter an "bind" übergeben? – dbush
@dbush Ich habe einige andere Posts gelesen und erkannte, dass ich mit 'INADDR_ANY' binden musste, was ich nicht tat. Ich habe das geändert, aber das Problem bleibt bestehen. Ich kann nur scheinen, wenn beide Schnittstellen laufen. – en4bz