Compruebe si el socket está escuchando en C

1 minuto de lectura

Avatar de usuario de Mihai Neacsu
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)?

avatar de usuario de mark4o
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.

¿Ha sido útil esta solución?