2010-07-05 5 views
5

Mam komputer z wieloma kartami NIC - i metoda wysyłania UDPClient ciągle się nie udaje. Oto kod:UDPClient Multicast receive kończy się niepowodzeniem na komputerze z wieloma kartami NIC

 private static void receiveData() 
    { 
     recvSock = new UdpClient(PORT); 
     //recvSock.Client.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastInterface, mainInterface); 
     recvSock.JoinMulticastGroup(IPAddress.Parse(IP), 50); 

     IPEndPoint iep = new IPEndPoint(IPAddress.Any, 0); 

     while (true) 
     { 
      byte[] data = recvSock.Receive(ref iep); 

      // Do not include messages from us 
      if (myIPs.Contains(iep.Address)) 
       continue; 

      string stringData = Encoding.ASCII.GetString(data, 0, data.Length); 
      Console.WriteLine("received: " + stringData); 

     } 
    } 

PORT = 5000 i IP = 224.5.6.7, więc powinno być OK. Głównym problemem jest to, że po prostu nie mogę ominąć linii recvSock.Receive(). Widzę pakiety przychodzące przez wireshark - ale kod po prostu ich nie przetwarza ...

Myśli? Z góry dziękuję!

Dan

EDIT: Mogę potwierdzić, że wielo- NIC powoduje problem --- kod działa poprawnie z jednym NIC. Odkomentowanie linii SetSocketOption powinno pozwolić jej działać z wieloma kartami sieciowymi, ale nadal nie działa .... myśli?

+0

Ta aplikacja "klient" [komputer] ma wiele kart NIC lub serwer, z którym łączy się wiele kart NIC? –

+0

Ponieważ mam ten sam problem, jestem gotów potwierdzić: "aplikacja klienta [komputer] ma wiele kart sieciowych". Zazwyczaj klient dotyczy serwerów znajdujących się w dowolnej z wielu sieci NIC. Serwer z wieloma kartami NIC jest ważny tylko wtedy, gdy klient widzi serwer _same_ za pośrednictwem wielu kart sieciowych po stronie klienta. –

+0

@Dan Czy znalazłeś sposób na obejście problemu? Mam ten sam problem. – J4N

Odpowiedz

0

Część interfejsu jest ważnym elementem w poniższym kodzie:

unsigned long interface; 
ip_mreq mreq; 

_parseHostname(_description->getInterface(), interface); 
mreq.imr_multiaddr.s_addr = _writeAddress.sin_addr.s_addr; 
mreq.imr_interface.s_addr = interface; 

setsockopt(_readFD, IPPROTO_IP, IP_ADD_MEMBERSHIP, 
       (char*)&mreq, sizeof(mreq)); 

Z interfejsem jest adres (unicast) IP otrzymać karty sieciowej.

+1

Ta odpowiedź _may_ może być przydatna. Ale ponieważ używa terminologii z radykalnie innego pakietu gniazd z pierwotnego pytania, ..., kto może powiedzieć? –

+1

Jedyną istotnością tej odpowiedzi dla danego pytania jest to, że oba zawierają słowo "IP". – BTownTKD

1

miałem ten sam problem znaleźć ten post, a następnie znaleźć rozwiązanie na: UDP: Read data from all network interfaces

Zasadniczo bind() do 0.0.0.0 nie działa i trzeba bind() i JoinMulticastGroup() na każdy lokalny adres IP. Muszę uwielbiać Microsoft dla tego.

Powiązane problemy