Повторная привязка в tcp не выполняется с тем же портом

#c #tcp #port

#c #tcp #порт

Вопрос:

В моем проекте я хочу открыть некоторый порт xxxx, и мне нужно записать данные и закрыть этот порт XXXX.

Снова я хочу снова открыть тот же порт, записать данные и закрыть. Это мое требование.

В первый раз я могу записать и закрыть, но во второй раз привязка не происходит. я не понимаю, почему может быть проблема с кодом или что-то еще.

Вот мой код.

 int main(void)
{
    int connection;
    int sock = create_socket(40056);
    struct sockaddr_in client_address;
    int len = sizeof(client_address);

    connection = accept(sock, (struct sockaddr*) amp;client_address,amp;len);
    close(connection);
    close(sock);
    sock = create_socket(40056);
    connection = accept(sock, (struct sockaddr*) amp;client_address,amp;len);
}

int create_socket(int port)
{
    int sockfd;
    struct sockaddr_in servaddr;
    int reuse = 1;

    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd == -1) {
        PRINTF("socket creation failed...rn");
    }
    else
        PRINTF("Socket successfully created..rn");

    // assign IP, PORT
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servaddr.sin_port = htons(port);
    setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, amp;reuse, sizeof reuse);

    // Binding newly created socket to given IP and verification
    if ((bind(sockfd, (struct sockaddr*)amp;servaddr, sizeof(servaddr))) 
    !=0) //here typedef amp;servaddr
    {
       PRINTF("socket bind failed...rn");
    }
    else
       PRINTF("Socket successfully binded.. %drn",port);

    listen(sockfd, 5);
    PRINTF("finished create socket functionrn");
    return sockfd;
}
  

Комментарии:

1. «… привязка не происходит. я не понимаю, почему …» — что именно вы имеете в виду под «не происходит». Завершается ли вызов bind ошибкой? Если да, какую точную ошибку вы получаете (например, check errno , call perror или аналогичную)? Также, пожалуйста, проверьте возвращаемое значение всех вызываемых вами функций, т. Е. Также проверьте setsockopt .

Ответ №1:

accept() блокируется, поскольку нет ожидающих подключений. Соответствующая часть отсюда:

        If no pending connections are present on the queue, and the socket is
       not marked as nonblocking, accept() blocks the caller until a
       connection is present.  If the socket is marked nonblocking and no
       pending connections are present on the queue, accept() fails with the
       error EAGAIN or EWOULDBLOCK.
  

Вы можете пометить сокет неблокирующим fcntl() , (необязательно) добавить вызов perror (чтобы получить «Ресурс временно недоступен») и запустить свой код, чтобы увидеть разницу.

 #include <fcntl.h>
#include <errno.h>

int create_socket(int port)
{
.
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    fcntl(sockfd, F_SETFL, O_NONBLOCK);
.
}

int main(void)
{
.
    connection = accept(sock, (struct sockaddr*) amp;client_address,amp;len);
    if (connection == -1) {
        perror("accept");
    }
.
}