2015-01-12 2 views
1

Я пытаюсь отправить много небольших (~ 350 байт) сообщений UDP на разные удаленные хосты, по одному пакету для каждого удаленного хоста. Я использую фоновый поток для прослушивания ответовC# UDP send/sendAsync слишком медленно

private void ReceivePackets() 
    { 
     while (true) 
     { 
      try 
      { 
       receiveFrom = new IPEndPoint(IPAddress.Any, localPort); 
       byte[] data = udpClientReceive.Receive(ref receiveFrom); 
       // Decode message & short calculation 
      } 
      catch (Exception ex) 
      { 
       Log("Error receiving data: " + ex.ToString()); 
      } 
     } 
    } 

и основной поток для отправки сообщений с помощью

udpClientSend.SendAsync(send_buffer, send_buffer.Length, destinationIPEP); 

Оба UdpClient udpClientReceive и UdpClient udpClientSend привязаны к тому же порту.
Проблема SendAsync() занимает около 15 мс, и мне нужно отправить несколько тысяч пакетов в секунду. Я уже пробовал использовать udpClientSend.Send(send_buffer, send_buffer.Length, destination);, который так же медленный. Я также установил оба буфера приема/отправки выше, и я попытался установить udpClientSend.Client.SendTimeout = 1;, который не имеет эффекта. Я подозреваю, что это может быть связано с изменением удаленного хоста для каждого отдельного пакета? Если это так, будет ли использование многих UDPclients в отдельных потоках ускорить работу?
Спасибо за помощь!

Примечания: Сетевая пропускная способность не является проблемой, и мне нужно использовать UDP, а не TCP. Я видел подобные вопросы на этом сайте, но ни один из них не удовлетворительный.

Редактировать

Существует только один поток для отправки, он работает простой цикл, в котором udpClientSend.SendAsync() называется.
Я запрашиваю узлы в DHT (bittorrent hashtable), поэтому многоадресная передача не является опцией (?) - каждый хост получает только 1 пакет.
Обмен UDPClient класс с классом Socket и использование AsyncSendTo() не ускоряет работу (или незначительно).

Я сузил проблему: изменение адреса удаленного хоста на определенный фиксированный IP-адрес & порт увеличивает пропускную способность до 3000 пакетов/с. Таким образом, изменение адреса назначения слишком часто кажется узким местом.

Я думаю, что моя проблема может быть связана с UDP "Connect"-Speed in C# и UDPClient.Connect() замедляет код. Если это так, есть ли исправление для этого? Это проблема языка или ОС?

+3

Я мало знаю об эффективности этих методов, но упоминание о 15 мс вызывает возможную проблему. Если вы отсчитываете это с помощью чего-то вроде GetTickCount(), то часы имеют разрешение около 15 мс, и измерение задержки неточно может привести к неправильному поиску решения. – Katie

+0

Я ничего не вижу в 'UdpClient' или' Socket', что должно приводить к низкой производительности. Вероятнее всего, объяснение Кэти. –

+0

Сколько пакетов в секунду вы измеряете? – usr

ответ

0

Почему вы используете UdpClient Connect перед отправкой? Это необязательный шаг, если вы хотите установить хост по умолчанию. Похоже, вы хотите отправить нескольким адресатам, чтобы вы могли устанавливать удаленный хост каждый раз, когда вы вызываете метод отправки.

Если вы решили удалить метод Connect, вы можете увидеть улучшение, но по-прежнему похоже, что у вас есть узкое место где-то еще в вашем коде. Изолируйте вызовы отправки и измерьте время, затем начните добавлять дополнительные шаги, пока не найдете то, что замедляет работу.

 var port = 4242; 
     var ipEndPoint1 = new IPEndPoint(IPAddress.Parse("192.168.56.101"), port); 
     var ipEndPoint2 = new IPEndPoint(IPAddress.Parse("192.168.56.102"), port); 
     var buff = new byte[350]; 
     var client = new UdpClient(); 

     int count = 0; 
     var stopWatch = new Stopwatch(); 
     stopWatch.Start(); 
     while (count < 3000) 
     { 
      IPEndPoint endpoint = ipEndPoint1; 
      if ((count % 2) == 0) 
       endpoint = ipEndPoint2; 

      client.Send(buff, buff.Length, endpoint); 
      count++; 
     } 
     stopWatch.Stop(); 

     Console.WriteLine("RunTime " + stopWatch.Elapsed.TotalMilliseconds.ToString()); 
Смежные вопросы