Подтвердить что ты не робот

Как получить количество данных в очереди для UDP-сокета?

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

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

4b9b3361

Ответ 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.