В том случае, если ни один сервер не принимает запросы по указанном адресу назначения, а клиент продолжает вызывать функцию recv (), вызов блокируется на неопределенно долгое время, поскольку от хоста никогда не поступит ответ 1.
Асинхронные сообщения об ошибках
Существует один способ получить некоторую информацию об ошибках связи UDP. Если сокет UDP подключен, то он может возвратить асинхронные сообщения об ошибках. Это сообщения об ошибках, которые возникают в какой-то момент после отправки дейтаграммы. К ним относятся ошибки ECONNREFUSED, сообщения от маршрутизаторов о том, что хост недоступен, а также сообщения о других проблемах.
Асинхронные сообщения об ошибках не распознаются функцией send(), поскольку она всегда сообщает об успехе, если дейтаграмма была успешно поставлена в очередь. Однако после возникновения асинхронного сообщения об ошибке при следующем вызове функция recv() возвращает значение undef и устанавливает переменную $! равной соответствующему сообщению об ошибке. Существует также возможность выбрать и очистить асинхронное сообщение об ошибке, вызвав функцию getsockopt () с командой SO_ERROR. Безусловно, такая ситуация может также возникнуть, если при передаче будет утерян запрос клиента или ответ сервера.
Для того чтобы определить, имеется ли асинхронное сообщение об ошибке, можно использовать функцию select () с сокетом UDP. Сокет будет обозначен как готовый для чтения и функция recv () не заблокируется.