繁体   English   中英

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

[英]TCP/IP in C connection value re assigning

我正在研究TCP / IP项目(服务器和许多客户端)。 我完全用C语言编写了代码。我观察到,只要有新客户端连接到服务器,函数accept()为该特定连接返回一个数字。

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

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

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

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

测试一下。

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM