2010-07-05 9 views
5

Tengo una computadora con varias NIC, y el método de envío UDPClient falla continuamente. Aquí está el código:UDPClient La recepción de multidifusión falla en la computadora con varias 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); 

     } 
    } 

PUERTO = 5000 e IP = 224.5.6.7 por lo que debería estar bien. El principal problema es que simplemente no puedo pasar la línea recvSock.Receive(). Veo que los paquetes vienen sobre wireshark, pero el código simplemente no los procesará ...

¿Pensamientos? ¡Gracias por adelantado!

Dan

EDIT: Me puede confirmar que las NIC múltiples está causando el problema --- el código funciona bien con una sola NIC. Descomentar la línea SetSocketOption debería permitirle trabajar con múltiples NIC, pero aún falla ... ¿pensamientos?

+0

Para ser claros, esta [máquina] de "cliente" tiene varias NIC o el servidor al que se conecta tiene varias NIC. –

+0

Como estoy teniendo el mismo problema, estoy dispuesto a confirmar: "la aplicación del cliente [máquina] tiene varias NIC". Normalmente, al cliente le preocupan los servidores que se encuentran en cualquiera de las múltiples redes de NIC. Un servidor que tiene varias NIC solo es importante si el cliente puede ver el _same_ servidor a través de varias NIC del lado del cliente. –

+0

@Dan ¿Encontró una solución? Estoy teniendo el mismo problema – J4N

Respuesta

0

La parte de interfaz es la parte importante en el siguiente código:

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 la interfaz es la dirección (unicast) IP de la tarjeta recibirán red.

+1

Esta respuesta _puede ser útil. Pero dado que usa la terminología de un paquete de socket radicalmente diferente de la pregunta original, ... ¿quién puede decirlo? –

+1

La única relevancia que tiene esta respuesta para la pregunta dada es que ambos contienen la palabra "IP". – BTownTKD

1

tuve el mismo problema se encontró este post, a continuación, se encontró la solución en: UDP: Read data from all network interfaces

Básicamente bind() en 0.0.0.0 no funciona y hay que bind() y JoinMulticastGroup() en cada dirección IP local. Tengo que amar a Microsoft por este.

Cuestiones relacionadas