同一端口不会在 tcp 中重新绑定

Rebinding in tcp is not happening with same port

在我的项目中,我想打开一些端口 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*) &client_address,&len);
    close(connection);
    close(sock);
    sock = create_socket(40056);
    connection = accept(sock, (struct sockaddr*) &client_address,&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...\r\n");
    }
    else
        PRINTF("Socket successfully created..\r\n");

    // 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, &reuse, sizeof reuse);

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

    listen(sockfd, 5);
    PRINTF("finished create socket function\r\n");
    return sockfd;
}

accept() 块,因为没有挂起的连接。来自 here 的相关文章是:

       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*) &client_address,&len);
    if (connection == -1) {
        perror("accept");
    }
.
}