【问题标题】:Rebinding in tcp is not happening with same porttcp 中的重新绑定不会发生在同一个端口上
【发布时间】:2021-01-28 10:29:53
【问题描述】:

在我的项目中,我想打开一些端口 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;
}

【问题讨论】:

  • "... 绑定没有发生。我不知道为什么..." - “没有发生”到底是什么意思。对bind 的调用是否失败?如果是,您得到的确切错误是什么(即检查errno,致电perror 或类似的)?另外请检查您调用的所有函数的返回值,即还要检查setsockopt

标签: c tcp port


【解决方案1】:

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");
    }
.
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多