多线程TCP服务器的侦听队列

多线程TCP服务器的侦听队列,tcp,listen,Tcp,Listen,在多线程TCP服务器中,侦听队列(侦听调用中的第二个参数)的意义是什么 这有点令人困惑,因为当我们有多个线程来处理不同的客户端时,为什么我们需要一个队列?来自MSDN: SOMAXCONN的backlog值是一个特殊常量,指示负责套接字的底层服务提供商将挂起连接队列的长度设置为最大合理值 在Windows Sockets 2上,此最大值默认为较大的值(通常为几百或更多)。在蓝牙应用程序中调用listen函数时,强烈建议backlog参数使用更低的值(通常为2到4),因为只接受少数客户端连接。这会

在多线程TCP服务器中,侦听队列(侦听调用中的第二个参数)的意义是什么

这有点令人困惑,因为当我们有多个线程来处理不同的客户端时,为什么我们需要一个队列?

来自MSDN:

SOMAXCONN的backlog值是一个特殊常量,指示负责套接字的底层服务提供商将挂起连接队列的长度设置为最大合理值

在Windows Sockets 2上,此最大值默认为较大的值(通常为几百或更多)。在蓝牙应用程序中调用listen函数时,强烈建议backlog参数使用更低的值(通常为2到4),因为只接受少数客户端连接。这会减少分配给侦听套接字使用的系统资源。同样的建议也适用于只需要少量客户端连接的其他网络应用程序

侦听功能通常由一次可以有多个连接请求的服务器使用。如果连接请求到达且队列已满,客户端将收到一个错误,并指示WSAECONNREFUSED


TCP服务器是多线程的事实与此无关,因为此队列位于应用程序空间之外,即操作系统和应用程序之间。

了解此概念;考虑下面的例子,

您知道TCP在建立连接时进行三方握手。当远程客户端连接到您的TCP服务器时,它发送SYN数据包,您的服务器用SYN-ACK数据包进行应答,然后该远程客户端再次发送ACK数据包,然后建立连接。因此,当应用程序完全建立时,它将获得连接。 因此,在连接完成一半之前(我的意思是您已从远程客户端接收到SYN,并已发送SYN-ACK,正在等待最后一次ACK),您的应用程序将不会接受连接。因此,可能有许多远程客户端试图连接到您的服务器,并且在您的侦听队列中可能有许多未完成的连接


我希望这能解释排队的原因

如果我错了,请纠正我。(示例)如果我有一个5的侦听队列,并且有9个客户端正在尝试(同时)连接到服务器,那么4个将被拒绝。因此,此队列指定可以排队的侦听操作数。线程的数量与这个队列无关。是的,你是对的。如果您的队列限制为5,并且5个或更多连接正在服务器端进行握手,则下一个连接将被拒绝。线程数仅在应用程序级别,此队列位于TCP驱动程序中。在应用程序/线程了解传入连接之前,队列会起作用。但我自己还没试过。根据这篇文章,即使服务器没有将客户机放在应用程序可以接受的事情队列中,客户机也会进行连接。