У меня есть клиентская программа, которая использует блокировку выбора (параметр времени ожидания NULL) в потоке, предназначенном для ожидания входящих данных на сокете UDP. Несмотря на то, что это блокировка, выборка иногда возвращалась бы с указанием, что единственный дескриптор чтения был «готов». Последующее recvfrom вернуло 0.
После некоторых экспериментов я обнаружил, что по крайней мере в Windows отправка UDP-пакета на порт хоста, который не ожидает, что это может привести к последующему recvfrom с получением 0 байтов. Я подозреваю, что с другого конца может прийти какое-то уведомление об отказе. Теперь я использую это как напоминание о том, что я забыл запустить процесс на сервере, который ищет входящий трафик клиента.
Кстати, если я вместо этого "отправлю" действительный, но неиспользуемый IP-адрес, то выбор не возвращает состояние готовности и блокируется, как ожидалось. Я также обнаружил, что блокирующие и неблокирующие сокеты не имеют значения.