2012-04-21 23 views

Respuesta

21

Esto se puede comprobar con getsockopt (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); 
-1

No se puede decir realmente. Debe hacer un seguimiento de ello usted mismo, y cuando quiera verificar si un zócalo es el zócalo de escucha, compare con el que ha guardado.

+0

Sí, estaba pensando en anexarlo a un conjunto de descriptores de archivos y usarlo para verificarlo. ¡Gracias por la respuesta! –

+2

'getsockopt (SOL_SOCKET, SO_ACCEPTCONN)' es la forma correcta de verificar un socket para escuchar. Deberías aceptar la respuesta de mark4o en su lugar. –

+0

@RemyLebeau No lo sabía. Si bien podría ser más código, pero se ajusta mejor a la pregunta del OP. –

-1

Se puede ejecutar en la línea de comandos (en un entorno Mac/Linux):

lsof -i 

y/o (Linux/Mac/Windows ambiente)

netstat -a 
+0

Pidió una solución C (no yo estaba abajo). – peterh

0

Estrictamente hablando, usted podría intente realizar una operación en el zócalo que de forma incidental determinaría qué tipo de zócalo es, como tratar de aceptar una conexión desde él. Si accept() falla con EINVAL, es una buena señal de que no está escuchando. :)

Sin embargo, es necesario hacer un seguimiento de qué enchufes son una mejor solución. A menos que esté construyendo una aplicación realmente trivial, es probable que necesite guardar algún tipo de datos adicionales en cada socket de todos modos.

Cuestiones relacionadas