Будут ли многие UdpClient ReceiveAsync ждать вечно?

У меня есть этот кусок кода, чтобы отправить команду через UdpClient а затем дождитесь ответа:

cameraListener = new UdpClient(52381);      
cameraSender = new UdpClient();
cameraSender.Connect(endPoint);  

int dataSent = await cameraSender.SendAsync(command, command.Length);
UdpReceiveResult result = await cameraListener.ReceiveAsync();

Примечание: endPoint - это просто обычный IP-адрес: конечная точка порта.

Что будет, если Camera вне форума?

Поскольку это UDP, SendAsync отправит данные правильно, но ReceiveAsync будет ждать ответа вечно. И если эти две строки кода (SendAsync и ReceiveAsyncвыполняется периодически, будет бесконечным ReceiveAsync ждать ответа вечно, пока система не выйдет из строя?

Или они будут прекращены или будут прекращены ОС в какой-то момент? Важно ли реализовать таймер для ручного "уничтожения" сокета UDP, чтобы завершить вечное ожидание?

1 ответ

Решение

UDP-сообщения могут быть потеряны. Это означает, что ваш прием действительно может ждать вечно, если другая сторона не повторяет свое сообщение. Вам нужен тайм-аут.

Еще хуже, если вы выполняете этот код несколько раз (с целью отправки несколько раз), вы можете получить сообщение, предназначенное для другой отправки, потому что при одновременных чтениях в одном сокете не определено, какое чтение получает какие данные.

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

Возможно, у вас должен быть цикл приема, который просто получает все, что получает, и обрабатывает его.

Отправка может быть независимой от этого.

Еще лучше использовать надежный транспорт, такой как TCP.

Другие вопросы по тегам