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