6

据我了解,积压决定了连接队列的大小。届时任何大于此大小的额外请求都将被丢弃(这个说法对吗??)。

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

socket()
bind()
listen(..., 5)
while(1)
{
  accept()
  read()
  write()
  sleep(3)
  close()
}

现在,我一次启动 8 个客户端连接到该服务器。令人惊讶的是,服务器为所有 8 个客户端提供服务,但它应该只排队 5 个客户端,其余 3 个客户端请求应该被拒绝。另一个有趣的点是即使我把这个积压值设为 0,结果还是一样的。然后我尝试评论listen()调用,所有8个客户端连接都被拒绝。

有人可以对此提供任何意见吗?

4

1 回答 1

4

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

listen()

这个答案似乎涵盖了它。

还有更多信息,引用自我的 Ubuntu 系统上的 listen(2) 手册页:

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

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

于 2012-05-25T06:40:20.980 回答