2010-07-05 21 views
5

J'ai un ordinateur avec plusieurs cartes d'interface réseau - et la méthode d'envoi de UDPClient échoue continuellement. Voici le code:La réception UDPClient Multicast échoue sur l'ordinateur avec plusieurs cartes réseau

 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 et IP = 224.5.6.7 ce qui devrait être OK. Le problème principal est que je ne peux pas dépasser la ligne recvSock.Receive(). Je vois les paquets qui arrivent sur wireshark - mais le code ne les traitera pas ...

Pensées? Merci d'avance!

Dan

EDIT: Je peux confirmer que le multi NPI est à l'origine du problème --- le code fonctionne très bien avec une seule carte réseau. Décommenter la ligne SetSocketOption devrait lui permettre de travailler avec plusieurs cartes réseau, mais cela échoue encore .... pensées?

+0

Pour être clair, cette application "client" [machine] a plusieurs NIC ou le serveur avec lequel vous vous connectez a plusieurs NIC ?? –

+0

Comme j'ai le même problème, je suis prêt à confirmer: "l'application client [machine] a plusieurs NIC". Généralement, le client est concerné par les serveurs se trouvant sur l'un des multiples réseaux NIC. Un serveur qui a plusieurs cartes réseau n'est important que si le client peut voir le serveur _same_ via plusieurs cartes réseau côté client. –

+0

@Dan Avez-vous trouvé une solution de contournement? J'ai le même problème – J4N

Répondre

0

La partie d'interface est la partie importante dans le code suivant:

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

Avec interface étant l'adresse IP (unicast) de la carte réseau recevoir.

+1

Cette réponse peut être utile. Mais puisqu'il utilise la terminologie d'un paquet de socket radicalement différent de la question originale, ..., qui peut le dire? –

+1

La seule pertinence de cette réponse à la question donnée est que les deux contiennent le mot "IP". – BTownTKD

1

j'ai eu le même problème trouvé ce post, puis a trouvé la solution à: UDP: Read data from all network interfaces

Fondamentalement bind() à 0.0.0.0 ne fonctionne pas et vous devez bind() et JoinMulticastGroup() sur tous les adresse IP locale. Je dois aimer Microsoft pour celui-ci.