Подтвердить что ты не робот

В Linux, может ли recv когда-либо возвращать 0 на UDP?

Я просто очищаю код, который мы написали некоторое время назад, и заметил, что для сокета udp 0 обрабатывается как закрытое соединение.

Я уверен, что это было результатом переноса того же цикла recv из эквивалентной версии tcp. Но это заставляет меня задуматься. Может ли recv вернуть 0 для udp? на tcp он сигнализирует, что другой конец закрыл соединение. udp не имеет понятия связи, поэтому он может вернуть 0? и если это возможно, что это значит?

Примечание: справочная страница в Linux не различает udp и tcp для кода возврата 0, поэтому мы сохранили проверку кода.

4b9b3361

Ответ 1

udp не имеет понятия соединения, поэтому он может возвращать 0? а также если это возможно, что это значит

Это означает, что датаграмма дейтаграммы длиной 0. Из большого UNP:

Написание дейтаграммы длины 0 допустимо. В случае UDP это приводит к IP-дейтаграмме, содержащей IP-заголовок (обычно 20 байт для IPv4 и 40 байтов для IPv6), 8-байтовый UDP-заголовок и отсутствие данных. Это также означает, что допустимое значение 0 из recvfrom допустимо для протокола дейтаграммы. Это не означает, что сверстник закрыл соединение, как и возвращаемое значение 0 из чтения в сокет TCP. Поскольку UDP является без установления соединения, нет такой вещи, как закрытие UDP соединение.