2013-05-28 3 views
0

У меня есть сервер сокетов (написан на C++), который получает запросы от клиентов и отправляет ответы обратно. Итак, мое тестовое клиентское приложение (C#) очень простое:UdpClient.Receive (...) не получает данных

Я запускаю оба приложения на одном компьютере. Сервер получает запрос на порт 10240 с клиентского порта 10241 и отправляет ответ обратно на порт клиента 10241, но клиент так и не получает его. Итак, я уверен, что сервер отправляет пакет обратно, потому что все отлично работает с клиентом C++. Это означает, что я делаю что-то не так на моем C# -кодире. Есть идеи?

Спасибо!

приписка> Просто проверить его с # клиент Berkley гнездо C:

 try { 
      // Create socket 
      Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 
      // Bind 
      IPEndPoint myEP = new IPEndPoint(IPAddress.Any, 0); 
      s.Bind(myEP); 

      // prepare the packet to send 
      iWritableBuff wbuff = new iWritableBuff(); 
      [ ... ] 

      // Send it 
      IPEndPoint sEP = new IPEndPoint(IPAddress.Parse(server_ip_address), 10240); 
      int res = s.SendTo(wbuff.GetBuff(), (int)wbuff.Written(), 0, sEP); 

      // Receive the response 
      byte[] receiveBytes = new Byte[1024]; 
      EndPoint recEP = new IPEndPoint(IPAddress.Any, 0); 
      res = s.ReceiveFrom(receiveBytes, ref recEP); 
      Console.WriteLine("We've got some data from the server!!! " + res + " bytes."); 
     } catch (Exception e) { 
      Console.WriteLine("ERROR: " + e.ToString()); 
     } 

И это отлично работает! Что не так с UdpSocket?

ответ

1

Не уверен, что это относится к UDPClients, которые не передают пакеты, а просто отправляют их по указанному адресу, но я столкнулся с аналогичным roadblock.

У меня был UDPClient, который транслировал пакет udp для обнаружения некоторых пользовательских машин в нашей сети. Когда я попытался получить сообщение о том, что серверы будут просто откликнуться назад, он не получит информацию и будет тайм-аут. Оказывается, если вы используете UDPClient, который передает сообщение, он НЕ сможет получать сообщения. Он нигде не документирован, кроме одной темы форума о msdn, к которой я, к счастью, столкнулся.

Решение должно было отправить сообщение, немедленно закрыть сокет, открыть новый UDPClient на том же порту, а затем использовать этот новый UDPClient для получения эхо-ответа UDP-пакета. Очень надоедливый.

Дайте этот снимок и посмотрите, работает ли он. Это определенно работает для отправки передаваемого пакета.

+1

Я думаю, что в вашем случае проблема заключалась в том, что вы использовали 'Connect' или' ConnectAsync', установив удаленную конечную точку на широковещательный адрес. Не подключайте, а поставляйте удаленную конечную точку с помощью вызова «Send» или «SendAsync», и вы сможете получать с помощью того же UdpClient. – Thorarin

Смежные вопросы