2010-07-05 12 views
5

Ho un computer con più schede NIC e il metodo di invio di UDPClient non riesce continuamente. Ecco il codice:La ricezione multicast UDPClient non riesce sul computer con più 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 e IP = 224,5.6.7 quindi dovrebbe essere OK. Il problema principale è che non riesco a superare la riga recvSock.Receive(). Vedo i pacchetti in arrivo su wireshark - ma il codice non li elaborerà semplicemente ...

Pensieri? Grazie in anticipo!

Dan

EDIT: posso confermare che il multi NIC causa il problema --- il codice funziona bene con una sola scheda di rete. Scomporre la linea SetSocketOption dovrebbe consentirgli di lavorare con più NIC, ma non riesce ancora .... pensieri?

+0

Per essere chiari, questa applicazione "client" [macchina] ha più schede di rete o il server a cui ci si connette ha più schede di rete ?? –

+0

Poiché ho lo stesso problema, sono disposto a confermare: "l'applicazione client [macchina] ha più NIC". In genere il client si occupa dei server che si trovano su una delle reti NIC multiple. Un server con più schede NIC è importante solo se il client può visualizzare il server _same_ tramite più schede NIC client. –

+0

@Dan Hai trovato una soluzione alternativa? Sto avendo lo stesso problema – J4N

risposta

0

La parte di interfaccia è la parte importante nel codice seguente:

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)); 

Con l'interfaccia di essere l'indirizzo (unicast) IP della scheda di ricezione di rete.

+1

Questa risposta può essere utile. Ma dal momento che utilizza la terminologia da un pacchetto socket radicalmente diverso dalla domanda originale, ... chi può dirlo? –

+1

L'unica pertinenza di questa risposta alla domanda data è che entrambi contengono la parola "IP". – BTownTKD

1

ho avuto lo stesso problema ha trovato questo post, poi ha trovato la soluzione a: UDP: Read data from all network interfaces

Fondamentalmente Bind() per 0.0.0.0 non funziona e bisogna bind() e JoinMulticastGroup() su ogni indirizzo IP locale. Devo amare Microsoft per questo.

Problemi correlati