2010-07-05 2 views
5

У меня есть компьютер с несколькими сетевыми адаптерами, а метод отправки UDPClient постоянно терпит неудачу. Вот код:Ошибка приема многоадресной передачи UDPClient на компьютере с несколькими сетевыми картами

 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 и IP = 224.5.6.7, так что все должно быть в порядке. Основная проблема заключается в том, что я просто не могу пройти мимо строки recvSock.Receive(). Я вижу, что пакеты поступают через wirehark - но код просто не будет их обрабатывать ...

Мысли? Заранее спасибо!

Dan

EDIT: Я могу подтвердить, что мультифункциональные сетевые адаптеры вызывает проблемы --- код отлично работает с одной NIC. Разоружение строки SetSocketOption должно позволить ей работать с несколькими сетевыми адаптерами, но все равно не удается ... мысли?

+0

Чтобы быть ясным, это «клиентское» приложение [машина] имеет несколько сетевых адаптеров или сервер, к которому подключено несколько сетевых адаптеров? –

+0

Поскольку у меня такая же проблема, я готов подтвердить: «клиентское приложение [машина] имеет несколько сетевых адаптеров». Обычно клиент связан с серверами, находящимися в любой из сетей NIC. Сервер, имеющий несколько сетевых адаптеров, имеет значение только в том случае, если клиент может видеть сервер _same_ через несколько клиентских интерфейсов NIC. –

+0

@ Dan Вы нашли обходное решение? У меня такая же проблема – J4N

ответ

0

Интерфейсная часть является важной частью в следующем коде:

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

С интерфейсом является (одноадресным) IP-адресом приемной сети карты.

+1

Этот ответ _may_ будет полезен. Но так как он использует терминологию из радикально различного пакета сокетов из исходного вопроса ..., кто может сказать? –

+1

Единственная актуальность этого ответа для данного вопроса заключается в том, что оба они содержат слово «IP». – BTownTKD

1

Я имел такой же вопрос нашел этот пост, то нашел решение по адресу: UDP: Read data from all network interfaces

В основном Bind() 0.0.0.0, не работает, и вы должны Bind() и JoinMulticastGroup() на каждый локальный IP-адрес. Должен любить Microsoft для этого.