Что возвращает сокет FIONREAD из UDP (датаграммы)?

Который делает ioctl из FIONREAD return, длина следующего пакета или длина всех данных в буфере?

Предположим, что есть UDP сервер, который получает 2 пакета от клиента 1 и еще 2 пакета от клиента 2 после пакета клиента 1. Тогда какова ценность ioctl из FIONREADи что делает readfrom вернуть в таком случае?

Клиент 1: v два пакета

++UDP-сервер получил 4 пакета <- FIONREAD?

Клиент 2: ^ два пакета

FIONREAD? (Сервер)

  1. длина первого пакета клиента 1
  2. длина двух пакетов клиента 1
  3. длина двух пакетов клиента 1 + два пакета клиента 2
  4. длина первого пакета клиента 1 + первый пакет клиента 2
  5. Другой

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() фактическое количество переданных байтов.

Другие вопросы по тегам