【问题标题】:TCP/IP in C connection value re assigningC 连接中的 TCP/IP 值重新分配
【发布时间】:2016-05-02 14:08:54
【问题描述】:

我正在从事 TCP/IP 项目(服务器和许多客户端)。我完全用 C 编写代码。我观察到,每当新客户端连接到服务器时,函数 accept() 都会为该特定连接返回一个数字。

  newton = accept(mysocket, (struct sockaddr *)&dest, &socksize)

上面代码中的newcon对于不同的客户端是不同的。每当客户端断开连接时,分配给该断开连接的客户端的连接号就消失了。该号码根本不会分配给其他客户。如果服务器有很多用户,那么客户端连接和断开连接很多次。所以数字继续增加(从0到更大的数字)。如果服务器连接了数百万个客户端,我应该如何处理?有什么办法可以再次使用连接号?

【问题讨论】:

  • That number is not going to get assigned to another client at all. 错误。 accept() 系统调用返回新连接的最低可用文件描述符。所以 fd(数字)被回收了。

标签: c sockets tcp tcp-ip


【解决方案1】:

您误解了accept 的返回值。它不是连接数,而是套接字描述符。 (在 *nix 平台上恰好是文件描述符,它是整数)。

如果先前分配的套接字之一关闭,则可以再次返回相同的数字 - 因此,为了保持您的可伸缩性,请确保在不再需要套接字后关闭它们 - 无论如何这是正确的做法.

【讨论】:

  • 我知道不是连接数。每次新客户端连接到服务器时,我都会得到一个新值。我得到的每个数字都不是小于该数字的先前数字。问题可能是没有关闭断开连接的客户端。谢谢
【解决方案2】:

测试一下。

创建一个整数数组,例如 10000 大小。当您接受连接时,将返回的 fd 值推送到该数组中。然后在最后,对数组进行排序并查找重复项。正如其他人所暗示的那样,您应该看到重复项。

【讨论】:

  • 测试的好主意。
【解决方案3】:

TCP 连接的服务器端实现旨在支持多个并发连接。此行为是使用以服务器套接字作为参数调用的 accept() 系统调用来实现的。当一个新的连接请求到达时,系统会创建一个新的套接字来处理这个新的连接,并且这个套接字描述符由 accept 系统调用返回。随后,这个新连接上的通信使用由 accept 返回的这个套接字描述符来处理。当与客户端的通信完成后,连接关闭,并将这个套接字描述符返回给系统。系统可以再次重用相同的描述符来再次处理新的客户端请求。

需要注意的是,一旦连接关闭,在某些情况下连接会进入TIME_WAIT状态,当连接状态为TIME_WAIT时,socket不会被重用。在 TIME_WAIT 状态之后,套接字变为空闲状态。所以很有可能当一个连接被假定为关闭时,它实际上可以处于 TIME_WAIT 状态。这可以使用“netstat -anp”命令进行验证。

套接字描述符是系统资源,每个系统都有打开描述符的最大数量上限。一旦达到该限制,系统将不接受新连接。因此,如果客户端-服务器系统以没有大量并发 TCP 连接的方式实现,则不会达到打开描述符的最大数量限制,服务器将继续为客户端提供服务。如果客户端-服务器系统需要大量持久连接,那么打开描述符的限制肯定是个问题,需要增加。

【讨论】:

  • "套接字描述符是系统资源,每个系统都有最大打开描述符数的上限",我们如何知道最大可能连接数?
  • 可以使用命令“cat /proc/sys/fs/file-max”检查Linux上打开文件描述符的最大数量的系统范围限制。可以使用参数 fs.file-max 上的 sysctl 命令修改此限制。
【解决方案4】:

accept 返回一个描述符。您可以实现一个数据结构,您可以在其中存储描述符并对其进行操作。但这取决于用例和您的实现以及您将如何处理它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-23
    • 2011-09-20
    • 2014-06-28
    • 1970-01-01
    相关资源
    最近更新 更多