多线程TCP服务器中侦听队列(listen调用中的第二个参数)的意义是什么?
这有点令人困惑,因为当我们有多个线程来处理不同的客户端时,为什么我们需要一个队列呢?
答案 0 :(得分:1)
来自MSDN:http://msdn.microsoft.com/en-us/library/ms739168(v=vs.85).aspx
SOMAXCONN的积压值是一个特殊常量,它指示负责套接字的底层服务提供者将挂起连接队列的长度设置为最大合理值。
在Windows套接字2上,此最大值默认为较大的值(通常为几百或更多)。在蓝牙应用程序中调用listen函数时,强烈建议将backlog参数(通常为2到4)使用更低的值,因为只接受少量客户端连接。这减少了分配给侦听套接字使用的系统资源。同样的建议适用于只需要少量客户端连接的其他网络应用程序。
listen函数通常由一次可以有多个连接请求的服务器使用。如果连接请求到达且队列已满,则客户端将收到错误并指示WSAECONNREFUSED。
TCP服务器是多线程的这一事实并不重要,因为此队列位于应用程序空间之外,即OS和应用程序之间。
答案 1 :(得分:0)
理解这个概念;考虑以下示例,
您知道TCP会进行3次握手以建立连接。当远程客户端连接到您的TCP服务器时,它发送SYN数据包,您的服务器回复SYN-ACK数据包,然后再次远程客户端发送ACK数据包然后建立连接。因此,您的应用程序在完全建立后获得连接。 因此,在您的连接完成一半之前(我的意思是您已从远程客户端收到SYN并且您已发送SYN-ACK并且您正在等待最后一次ACK),您的应用程序将不接受连接。因此可能有许多远程客户端尝试连接到您的服务器,并且您的侦听队列中可能有许多半连接的连接。
我希望它解释了侦听队列。