Как получить количество данных в очереди для сокета UDP? - PullRequest
14 голосов
/ 14 февраля 2012

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

Я знаю, что могу получить размер очереди через SO_RCVBUF опция сокета, и ioctl(<sockfd>, SIOCINQ, &<some_int>) сообщает мне информацию о сокетах TCP.Но для UDP SIOCINQ / FIONREAD ioctl возвращает только размер следующей ожидающей дейтаграммы.Есть ли способ, как получить размер очереди для UDP, без необходимости разбирать системные таблицы, такие как /proc/net/udp?

Ответы [ 2 ]

8 голосов
/ 15 февраля 2012

FWIW, я провел несколько экспериментов, чтобы отобразить поведение FIONREAD на разных платформах.

Платформы, на которых FIONREAD возвращает все данные, ожидающие обработки в SOCK_DGRAM сокете:

Mac OS X, NetBSD, FreeBSD, Solaris, HP-UX, AIX, Windows

Платформы, на которых FIONREAD возвращает только байты для первой ожидающей дейтаграммы:

Linux

Возможно, также стоит отметить, что некоторые реализации включают в число заголовки или другие служебные байты, тогда как другие считают только байты полезной нагрузки. Похоже, Linux возвращает размер полезной нагрузки, не включая заголовки IP.

6 голосов
/ 15 февраля 2012

Как упоминалось в ldx, он не поддерживается через ioctl или getsockopt.Мне кажется, что текущая реализация SIOCINQ была нацелена на то, чтобы определить, какой объем буфера необходим для чтения всего ожидающего буфера (но я полагаю, что это не так полезно для этого, так как он может меняться между чтением его и фактическим буфером).читать).

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

Вы можете проверить сбрасывания / ошибки через "netstat -su ", или лучше использовать SNMP (udpInErrors), если вы просто хотите отслеживать состояние машины.

Кстати: у вас всегда есть возможность взломать код ядра и добавить это значение (или другие).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...