Я пытаюсь отправить много небольших (~ 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()
замедляет код. Если это так, есть ли исправление для этого? Это проблема языка или ОС?
Я мало знаю об эффективности этих методов, но упоминание о 15 мс вызывает возможную проблему. Если вы отсчитываете это с помощью чего-то вроде GetTickCount(), то часы имеют разрешение около 15 мс, и измерение задержки неточно может привести к неправильному поиску решения. – Katie
Я ничего не вижу в 'UdpClient' или' Socket', что должно приводить к низкой производительности. Вероятнее всего, объяснение Кэти. –
Сколько пакетов в секунду вы измеряете? – usr