Mihai Neacsu
Mientras itero a través de los descriptores de archivos de socket, ¿cómo puedo verificar si uno de ellos es de un socket pasivo (escuchando conexiones)?
marca4o
Esto se puede comprobar con recibe(SO_ACCEPTCONN). Por ejemplo:
#include <sys/socket.h>
int val;
socklen_t len = sizeof(val);
if (getsockopt(fd, SOL_SOCKET, SO_ACCEPTCONN, &val, &len) == -1)
printf("fd %d is not a socket\n", fd);
else if (val)
printf("fd %d is a listening socket\n", fd);
else
printf("fd %d is a non-listening socket\n", fd);
-
FWIW: Mac OS X High Sierra (10.13.6) no parece aceptar SO_ACCEPTCONN. La página del manual para getsockopt no lo tiene; y una llamada te devuelve el error 42: Protocolo no disponible.
– Sam Habiel
10 de agosto de 2018 a las 14:29
Puede ejecutar en la línea de comandos (en un entorno Mac/Linux):
lsof -i
y/o (entorno Linux/Mac/Windows)
netstat -a
-
Pidió una solución C (no se me fue la baja).
– peterh
25/06/2016 a las 21:48
Estrictamente hablando, podría intentar realizar una operación en el zócalo que, de paso, determinaría qué tipo de zócalo es, como intentar aceptar una conexión desde él. Si accept()
falla con EINVAL, eso es una buena señal de que no está escuchando. 🙂
Sin embargo, hacer un seguimiento de qué enchufes son cuáles es una mejor solución en general. A menos que esté creando una aplicación realmente trivial, lo más probable es que necesite mantener algún tipo de datos adicionales en cada socket de todos modos.