TCP/IP在C连接值重新赋值
TCP/IP in C connection value re assigning
我正在从事 TCP/IP 项目(服务器和许多客户端)。我完全用 C 编写代码。我观察到每当一个新客户端连接到服务器时,函数 accept()
returns 一个特定连接的数字。
newton = accept(mysocket, (struct sockaddr *)&dest, &socksize)
上面代码中的newcon
对于不同的客户端是不同的。每当客户端断开连接时,分配给该断开连接的客户端的连接号就会消失。该号码根本不会分配给其他客户。如果服务器有很多用户,那么客户端会连接和断开很多次。所以数字继续增加(从 0 到更大的数字)。如果服务器连接了数百万个客户端,我应该如何处理?有什么办法可以再次重用连接号吗?
您误解了 accept
的 return 值。它不是连接数,而是一个套接字描述符。 (这恰好是文件描述符,在 *nix 平台上是整数)。
如果先前分配的套接字之一关闭,则可以再次 return 编辑相同的数字 - 因此,为了保持可伸缩性,请确保在不再需要套接字后关闭套接字 - 这无论如何都是正确的做法。
接受 returns一个描述符。您可以实现一个数据结构,您可以在其中存储描述符并对其进行操作。但这取决于用例和您的实施以及您将如何处理它们。
测试一下。
创建一个整数数组,假设大小为 10000。当您接受连接时,将返回的 fd 值压入该数组。然后在最后,对数组进行排序并查找重复项。正如其他人所暗示的那样,您应该看到重复项。
TCP 连接的服务器端实现旨在支持多个并发连接。此行为是使用 accept() 系统调用实现的,该系统调用以服务器套接字作为参数调用。当一个新的连接请求到达时,系统创建一个新的套接字来处理这个新的连接,这个套接字描述符由accept系统调用返回。随后,使用 accept 返回的套接字描述符处理此新连接上的通信。当与客户端的通信完成后,关闭连接并将这个套接字描述符返回给系统。系统可以再次重用相同的描述符来再次处理新的客户端请求。
需要注意的是,一旦连接关闭,在某些情况下连接会进入TIME_WAIT状态,当连接状态为TIME_WAIT时套接字不会被重新使用。套接字在 TIME_WAIT 状态后变为空闲。所以很有可能当一个连接假设关闭时,它实际上可能处于 TIME_WAIT 状态。这可以使用 'netstat -anp' 命令进行验证。
套接字描述符是系统资源,每个系统对打开描述符的最大数量都有上限。一旦达到该限制,系统将不再接受新连接。因此,如果客户端-服务器系统的实现方式没有大量并发 TCP 连接,则不会达到打开描述符的最大数量限制,服务器将继续为客户端提供服务。如果客户端-服务器系统需要大量持久连接,那么打开描述符的限制肯定是个问题,需要增加。
我正在从事 TCP/IP 项目(服务器和许多客户端)。我完全用 C 编写代码。我观察到每当一个新客户端连接到服务器时,函数 accept()
returns 一个特定连接的数字。
newton = accept(mysocket, (struct sockaddr *)&dest, &socksize)
上面代码中的newcon
对于不同的客户端是不同的。每当客户端断开连接时,分配给该断开连接的客户端的连接号就会消失。该号码根本不会分配给其他客户。如果服务器有很多用户,那么客户端会连接和断开很多次。所以数字继续增加(从 0 到更大的数字)。如果服务器连接了数百万个客户端,我应该如何处理?有什么办法可以再次重用连接号吗?
您误解了 accept
的 return 值。它不是连接数,而是一个套接字描述符。 (这恰好是文件描述符,在 *nix 平台上是整数)。
如果先前分配的套接字之一关闭,则可以再次 return 编辑相同的数字 - 因此,为了保持可伸缩性,请确保在不再需要套接字后关闭套接字 - 这无论如何都是正确的做法。
接受 returns一个描述符。您可以实现一个数据结构,您可以在其中存储描述符并对其进行操作。但这取决于用例和您的实施以及您将如何处理它们。
测试一下。
创建一个整数数组,假设大小为 10000。当您接受连接时,将返回的 fd 值压入该数组。然后在最后,对数组进行排序并查找重复项。正如其他人所暗示的那样,您应该看到重复项。
TCP 连接的服务器端实现旨在支持多个并发连接。此行为是使用 accept() 系统调用实现的,该系统调用以服务器套接字作为参数调用。当一个新的连接请求到达时,系统创建一个新的套接字来处理这个新的连接,这个套接字描述符由accept系统调用返回。随后,使用 accept 返回的套接字描述符处理此新连接上的通信。当与客户端的通信完成后,关闭连接并将这个套接字描述符返回给系统。系统可以再次重用相同的描述符来再次处理新的客户端请求。
需要注意的是,一旦连接关闭,在某些情况下连接会进入TIME_WAIT状态,当连接状态为TIME_WAIT时套接字不会被重新使用。套接字在 TIME_WAIT 状态后变为空闲。所以很有可能当一个连接假设关闭时,它实际上可能处于 TIME_WAIT 状态。这可以使用 'netstat -anp' 命令进行验证。
套接字描述符是系统资源,每个系统对打开描述符的最大数量都有上限。一旦达到该限制,系统将不再接受新连接。因此,如果客户端-服务器系统的实现方式没有大量并发 TCP 连接,则不会达到打开描述符的最大数量限制,服务器将继续为客户端提供服务。如果客户端-服务器系统需要大量持久连接,那么打开描述符的限制肯定是个问题,需要增加。