Как получить количество данных в очереди для сокета 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.

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