ver socket servidor puertos por enviar conexiones comando cliente archivos activas abiertos linux sockets udp

linux - servidor - ¿Cómo obtengo la cantidad de datos en cola para el socket UDP?



socket cliente-servidor en c linux (2)

Para ver qué tan bien me está yendo en el procesamiento de datos entrantes, me gustaría medir la longitud de la cola en mis sockets TCP y UDP.

Sé que puedo obtener el tamaño de la cola mediante la opción de socket SO_RCVBUF , y que ioctl(<sockfd>, SIOCINQ, &<some_int>) me dice la información para los sockets TCP. Pero para UDP, el ioctl SIOCINQ / FIONREAD devuelve solo el tamaño del siguiente datagrama pendiente. ¿Hay alguna forma de obtener el tamaño de cola para UDP sin tener que analizar tablas del sistema como /proc/net/udp ?


Como se menciona en ldx, no es compatible con ioctl o getsockopt. Me parece que la implementación actual de SIOCINQ tenía como objetivo determinar cuánto buffer se necesita para leer todo el buffer de espera (pero supongo que no es tan útil para eso, ya que puede cambiar entre la lectura del mismo y el buffer actual leer).

Hay muchas otras telemetrías que no son compatibles a través de tales llamadas al sistema, supongo que no hay una necesidad real en el uso normal de la producción.

Puede verificar las caídas / errores a través de "netstat -su", o mejor usando SNMP (udpInErrors) si solo desea monitorear el estado de la máquina.

Por cierto: siempre tienes la opción de hackear el código Kernel y agregar este valor (u otros).


FWIW, hice algunos experimentos para mapear el comportamiento de FIONREAD en diferentes plataformas.

Plataformas donde FIONREAD devuelve todos los datos pendientes en un socket SOCK_DGRAM :

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

Plataformas donde FIONREAD devuelve solo los bytes para el primer datagrama pendiente:

Linux

También podría valer la pena señalar que algunas implementaciones incluyen encabezados u otros bytes generales en el recuento, mientras que otros solo cuentan los bytes de la carga útil. Parece que Linux devuelve el tamaño de la carga útil, sin incluir los encabezados de IP.