¿Cómo encuentro en C que un puerto es de uso libre?

El sistema operativo es Linux. Tengo un proceso de servidor que puede cambiar su puerto en tiempo real. Sin embargo, me gustaría saber de antemano si un puerto está libre antes de enlazar.

Escenario: El servidor enlaza a localhost: 5000 y recibe una solicitud para vincular en localhost: 6000. El servidor tiene que comprobar si el puerto está libre. Esta pregunta busca respuestas que proporcionen una rutina que verifique si un puerto está libre o no.

Para el registro, estoy editando mi pregunta con un fragmento de código que verifica si un puerto es de uso libre. Esto no significa que será utilizado. El siguiente código responde a la pregunta "si el puerto está disponible en este momento", no lo usa. Abre un socket, verifique si el enlace devuelve EADDRINUSE y cierra el socket.

<code>#include <iostream>
#include <sys/socket.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <errno.h>

int main(int argc, char **argv) {

    struct sockaddr_in serv_addr;
    if( argc < 2 )
        return 0;
    int port = atoi(argv[1]);

    int sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if( sockfd < 0 ) {
        printf("socket error\n");
        return 0;
    } else {
        printf("Opened fd %d\n", sockfd);
    }

     bzero((char *) &serv_addr, sizeof(serv_addr));
     serv_addr.sin_family = AF_INET;
     serv_addr.sin_addr.s_addr = INADDR_ANY;
     serv_addr.sin_port = htons(port);
     if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) {

        if( errno == EADDRINUSE )
        {
            printf("the port is not available. already to other process\n");
        } else {
            printf("could not bind to process (%d) %s\n", errno, strerror(errno));
        }
    }

    if (close (sockfd) < 0 ) {
        printf("did not close fd: %s\n", strerror(errno));
        return errno;
    }

    return 0;


}
</code>

Aquí hay algunas ejecuciones de muestra (salidas parciales)

<code>[bash{1051}{51}]:[~/some_sources/checkbind]::./a.out 41067
the port is not available. already to other process
[bash{1052}{52}]:[~/some_sources/checkbind]::./a.out 22
could not bind to process (13) Permission denied
[bash{1053}{53}]:[~/some_sources/checkbind]::./a.out 22000
Opened fd 3
</code>

Respuestas a la pregunta(3)

Su respuesta a la pregunta