как мне найти в C, что порт свободен для использования?

ОС — Linux. У меня есть серверный процесс, который может менять свой порт в реальном времени. Однако я хотел бы заранее знать, свободен ли порт перед привязкой.

Сценарий :Сервер привязывается к локальному хосту :5000 и получает запрос на привязку к локальному хосту :6000. Сервер должен проверить, свободен ли порт. Этот вопрос ищет ответы, которые предоставляют подпрограмму, которая проверяет, свободен ли порт или нет.

Для протокола: я редактирую свой вопрос, добавляя фрагмент кода, который проверяет, свободен ли порт для использования. Это не значит, что он будет использоваться. Код ниже отвечает на вопрос «если порт доступен прямо сейчас», он его не использует. Открывает сокет, проверяет, возвращает ли bind EADDRINUSE и закрывает сокет.

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


}

Вот несколько пробных запусков (частичные результаты)

[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
11
задан cateof 25 April 2012 в 07:35
поделиться