Что возвращает сокет FIONREAD из UDP (датаграммы)?
Который делает ioctl
из FIONREAD
return, длина следующего пакета или длина всех данных в буфере?
Предположим, что есть UDP
сервер, который получает 2 пакета от клиента 1 и еще 2 пакета от клиента 2 после пакета клиента 1. Тогда какова ценность ioctl
из FIONREAD
и что делает readfrom
вернуть в таком случае?
Клиент 1: v два пакета
++UDP-сервер получил 4 пакета <- FIONREAD?
Клиент 2: ^ два пакета
FIONREAD? (Сервер)
- длина первого пакета клиента 1
- длина двух пакетов клиента 1
- длина двух пакетов клиента 1 + два пакета клиента 2
- длина первого пакета клиента 1 + первый пакет клиента 2
- Другой
2 ответа
Решение
man udp (7) утверждает:
FIONREAD (SIOCINQ) Gets a pointer to an integer as argument. Returns the size of the next pending datagram in the integer in bytes, or 0 when no datagram is pending. Warning: Using FIONREAD, it is impossible to distinguish the case where no datagram is pending from the case where the next pending datagram contains zero bytes of data. It is safer to use select(2), poll(2), or epoll(7) to distinguish these cases.
Итак, ответ на ваш вопрос: FIONREAD возвращает размер следующей (первой) ожидающей дейтаграммы.
Это зависит от платформы.
- На некоторых платформах FIONREAD на сокете UDP возвращает размер первой дейтаграммы.
- В других случаях он возвращает общее количество байтов, которые могут быть прочитаны без блокировки, что является общим числом байтов, находящихся в данный момент в буфере приема сокета.
Смотрите здесь для получения дополнительной информации.
Возвращаемое значение recvfrom()
фактическое количество переданных байтов.