c - C 中的 TCP 服务器 - 端口总是在增加?

标签 c sockets networking tcp

这是我的服务器程序的主要代码在C:

int main(int argc, char** argv)
{
    int sock, connected, bytes_received, true = 1;

    struct sockaddr_in server_addr, client_addr;
    int sin_size;

    if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
        perror("Socket");
        exit(1);
    }

    if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &true, sizeof (int)) == -1) {
        perror("Setsockopt");
        exit(1);
    }

    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(atoi(argv[1]));
    server_addr.sin_addr.s_addr = INADDR_ANY;
    bzero(&(server_addr.sin_zero), 8);

    if (bind(sock, (struct sockaddr *) &server_addr, sizeof (struct sockaddr))
            == -1) {
        perror("Unable to bind");
        exit(1);
    }

    if (listen(sock, 5) == -1) {
        perror("Listen");
        exit(1);
    }

    printf("\nTCPServer Waiting for client on port 5000");
    fflush(stdout);

    while (1) 
    {
        pthread_t child;

        sin_size = sizeof (struct sockaddr_in);
        connected = accept(sock, (struct sockaddr *) &client_addr, &sin_size);
        printf("\n I got a connection from (%s , %d)\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));

        threadInfo info;
        info.argumentsPassedToCode = argv;
        info.connected = connected;

        pthread_create(&child, NULL, interpretMessage, &info);
    }

    close(sock);
    return 0;
}

我的服务器总是打印出传入连接的 IP 和它来自的端口。我注意到端口总是在增加。

  1. 这正常吗?如果不是,我做错了什么?
  2. 如果我的服务器运行了很长时间,它会用完端口吗?如果是这样,会发生什么?

最佳答案

  1. 如果您的服务器正常工作,则说明您没有做错任何事。源端口不保证遵循某种模式,它们只是为了完成连接元组而存在(源端口、源地址、目标端口、目标地址)。
  2. 一旦连接关闭,端口就会被重用,所以你应该没问题。

关于c - C 中的 TCP 服务器 - 端口总是在增加?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5495477/

相关文章:

C 服务器不接受任何客户端

android - 如何从 Android 设备发送 icmpv6 路由器广告消息

javascript - 使用 stringify 通过套接字发送数据

c - 我需要将一个文件(现在是文本文件)拆分为多个缓冲区 C

c - 为什么我只看到带有此代码的主机的 inet 地址之一?

c - 服务器不读取来自客户端的消息

c - open命令适合二进制文件操作吗

无法抑制对旧版 GCC 的警告

c++ - 在 OpenCV 中将 cv::Mat 转换为 Cvmat*

c - 怎么用DrRacket实现C语言呢?