C连接值中的TCP / IP重新分配

时间:2016-04-28 14:04:35

标签: c sockets tcp tcp-ip

我正在研究TCP / IP项目(服务器和许多客户端)。我在C中完全编写了代码。我观察到,只要新客户端连接到服务器,函数accept()就会返回该特定连接的编号。

  newton = accept(mysocket, (struct sockaddr *)&dest, &socksize)
上述代码中的

newcon对于不同的客户端是不同的。每当客户端断开连接时,分配给该断开连接的客户端的连接号就会消失。这个数字根本不会被分配给另一个客户。如果服务器有很多用户,那么客户端连接和断开很多次。所以这个数字还在增加(从0到更大的数字)。如果服务器连接了数百万个客户端,我该如何处理?有什么办法可以重新使用连接号吗?

4 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

测试一下。

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

答案 2 :(得分:0)

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

应该注意,一旦连接关闭,在某些情况下连接将进入TIME_WAIT状态,并且当连接状态为TIME_WAIT时,不会重新使用套接字。 TIME_WAIT状态后,套接字变为空闲状态。因此,当假设一个连接被关闭时,它很可能实际上处于TIME_WAIT状态。这可以使用'netstat -anp'命令进行验证。

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

答案 3 :(得分:-1)

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