2016-04-08 8 views
1

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?

+0

Welche Parameter an "bind" übergeben? – dbush

+0

@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

Antwort

0

In einem multihomed Host müssen Sie in der Regel über alle verfügbaren Schnittstellen teilnehmen, sofern Sie nicht wissen, dass Multicasts nur über einen von ihnen ankommen werden. Andernfalls wird die IGMP-Beitrittsnachricht nicht an alle möglichen Router gesendet.

+0

Die Hosts sind über einen einzigen Switch verbunden, wobei IGMP Snooping + Querying aktiviert ist. Ich kann in der IGMP-Tabelle sehen, dass beide Schnittstellen/Ports den Gruppen beigetreten sind. Ich glaube also nicht, dass IGMP das Problem ist. – en4bz