听()忽略积压值
Posted
技术标签:
【中文标题】听()忽略积压值【英文标题】:listen() ignoring backlog value 【发布时间】:2012-05-31 18:05:51 【问题描述】:据我了解,backlog 决定了连接队列 的大小。届时任何大于此大小的额外请求都将被丢弃(这种说法正确吗??)。
现在我有一个非常简单的程序server.c
socket()
bind()
listen(..., 5)
while(1)
accept()
read()
write()
sleep(3)
close()
现在,我一次启动 8 个客户端来连接到该服务器。令人惊讶的是,服务器为所有 8 个客户端提供服务,但它应该只排队 5 个客户端,其余 3 个客户端请求应该被拒绝。另一个有趣的点是即使我把这个积压值设为 0,结果还是一样的。然后我尝试评论 listen() 调用,所有 8 个客户端连接都被拒绝。
有人可以对此提供任何意见吗?
【问题讨论】:
您应该将read
、write
和close
放在并发环境中。在您的代码中,当下一个连接是 accept
ed 时,似乎前一个连接已经关闭。将代码放在一个线程中,并确保每个连接持续足够长的时间,以确保真正发生 8 个客户端同时请求您的服务器的情况。
我正在测试 backlog 某个时间,但没有得到任何结果。希望现在就能看到答案。
OP,你能发布你的示例代码吗?以便人们可以复制/粘贴和测试它。
@ Summer_More_More_Tea 之前的连接无法立即关闭,因为存在 3 秒的休眠。这里所有 8 个请求都在 3 秒之前到达,因此请求已经超过了待处理队列(5)。
listen() ignores the backlog argument?的可能重复
【参考方案1】:
积压参数是关于队列大小的提示。所以你不能指望它做你所要求的。
listen()
这个answer 似乎覆盖了它。
还有更多信息,引用自我的 Ubuntu 系统上的 listen(2) 手册页:
backlog 参数定义了 sockfd 的挂起连接队列可以增长到的最大长度。如果队列满时有连接请求到达, 客户端可能会收到带有 ECONNREFUSED 指示的错误,或者,如果底层协议支持重传,则可能会忽略该请求,以便稍后 重试连接成功。
请注意,它到处都写着“可能”。
【讨论】:
在我的系统中 SOMAXCONN 设置为 128。那么如果我一次启动超过 128 个客户端会是什么行为。 是的,规范说应该支持高达 128 的值,但没有义务实际限制未完成的连接。我假设这个规范与你使用的类似。 查看我的答案的修订版。以上是关于听()忽略积压值的主要内容,如果未能解决你的问题,请参考以下文章