jak znaleźć w C, że port jest darmowy?

System operacyjny to Linux. Mam proces serwera, który może zmienić swój port w czasie rzeczywistym. Chciałbym jednak wiedzieć wcześniej, czy port jest wolny przed wiążącym.

Scenariusz: serwer wiąże localhost: 5000 i odbiera żądanie powiązania w localhost: 6000. Serwer musi sprawdzić, czy port jest wolny. To pytanie szuka odpowiedzi, które zapewniają procedurę sprawdzającą, czy port jest wolny, czy nie.

Dla rekordu edytuję moje pytanie fragmentem kodu, który sprawdza, czy port jest darmowy. Nie oznacza to, że zostanie użyty. Poniższy kod odpowiada na pytanie „czy port jest obecnie dostępny”, nie używa go. Otwiera gniazdo, sprawdź, czy bind zwraca EADDRINUSE i zamyka gniazdo.

<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>

Oto kilka przykładowych przebiegów (częściowe wyjścia)

<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>

questionAnswers(3)

yourAnswerToTheQuestion