ioctl загружается на необработанный сокет в Linux

StackOverflow https://stackoverflow.com/questions/806443

  •  03-07-2019
  •  | 
  •  

Вопрос

У меня есть реализация, которая использует ioctl (FIONREAD) для определения количества ожидающих октетов в буфере приема необработанного сокета в Linux, а затем вызывает recv для этого.

Я где-то читал, что интерфейс ioctl для необработанных сокетов в Linux на самом деле не возвращает фактические ожидающие октеты.Правильно ли это?

Я спрашиваю, потому что время от времени я теряю некоторые сообщения при высоких нагрузках и до сих пор не смог выяснить, где именно.Это лучший способ определить количество ожидающих октетов в необработанном сокете.

Это было полезно?

Решение

Всегда существует вероятность того, что ядро отбросит пакеты, если ваше приложение не сможет поддерживать скорость передачи пакетов (поскольку буфер ядра не безграничен).

Кстати, зачем вам вообще нужно знать количество октетов?Поскольку это пакетные сокеты, длина пакета всегда будет ограничена максимальным размером кадра сетевого интерфейса, поэтому просто передайте в recv достаточно большой буфер.

Сказав это, если производительность имеет решающее значение, вам следует изучить PACKET_MMAP - ПАКЕТ_MMAP поддержка в Linux.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top