listen()忽略积压值

use*_*528 6 c sockets backlog listen

据我了解,backlog确定连接队列的大小.当时大小如此大的额外请求将被取消(这个声明是正确的吗?).

现在我有一个非常简单的程序server.c

socket()
bind()
listen(..., 5)
while(1)
{
  accept()
  read()
  write()
  sleep(3)
  close()
}
Run Code Online (Sandbox Code Playgroud)

现在,我开始8个客户同时连接到该服务器.令人惊讶的是,服务器为所有8个客户端提供服务,但它应该只排队5个客户端,其余3个客户端请求应该被拒绝.另一个有趣的观点是,即使我将此积压值设为0,结果仍然相同.然后我尝试评论listen()调用,所有8个客户端连接被拒绝.

有人可以就此提供任何意见.

Fra*_* IV 4

backlog 参数是关于队列大小的提示。所以你不能指望它做你所要求的事情。

listen()

这个答案似乎涵盖了它。

更多信息,请引用我的 Ubuntu 系统上的 Listen(2) 手册页:

backlog 参数定义 sockfd 的挂起连接队列可以增长的最大长度。如果连接请求在队列已满时到达,则客户端可能会收到带有 ECONNREFUSED 指示的错误,或者如果底层协议支持重传,则可能会忽略该请求,以便稍后重新尝试连接成功。

请注意,它到处都说“可能”。