Будут ли многие 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.