Как получить количество данных в очереди для UDP-сокета?
Чтобы узнать, насколько хорошо я занимаюсь обработкой входящих данных, я бы хотел измерить длину очереди в своих сокетах TCP и UDP.
Я знаю, что могу получить размер очереди с помощью опции SO_RCVBUF
socket, и что ioctl(<sockfd>, SIOCINQ, &<some_int>)
сообщает мне информацию о сокетах TCP. Но для UDP SIOCINQ
/FIONREAD
ioctl возвращает только размер следующей ожидающей датаграммы. Есть ли способ получить размер очереди для UDP, без необходимости анализировать системные таблицы, такие как /proc/net/udp
?
Ответы
Ответ 1
Как упоминалось в ldx, он не поддерживается через ioctl или getsockopt.
Мне кажется, что текущая реализация SIOCINQ была направлена на то, чтобы определить, сколько буфера необходимо для чтения всего буфера ожидания (но я думаю, что это не так полезно для него, поскольку оно может изменяться между чтением его в фактический буфер чтения).
Есть много других телеметрий, которые не поддерживаются, хотя такие системные вызовы, я думаю, нет реальной потребности в нормальном использовании.
Вы можете проверить капли/ошибки через "netstat -su" или лучше использовать SNMP (udpInErrors), если вы просто хотите контролировать состояние машины.
Кстати: у вас всегда есть возможность взломать код ядра и добавить это значение (или другие).
Ответ 2
FWIW, я сделал несколько экспериментов, чтобы отобразить поведение FIONREAD
на разных платформах.
Платформы, где FIONREAD
возвращает все ожидающие данные в сокете SOCK_DGRAM
:
Mac OS X, NetBSD, FreeBSD, Solaris, HP-UX, AIX, Windows
Платформы, где FIONREAD
возвращает только байты для первой ожидающей датаграммы:
Linux
Можно также отметить, что некоторые реализации включают заголовки или другие служебные байты в счете, в то время как другие только подсчитывают байты полезной нагрузки. Linux, похоже, возвращает размер полезной нагрузки, не считая заголовков IP.