听()忽略积压值

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 个客户端连接都被拒绝。

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

【问题讨论】:

您应该将readwriteclose 放在并发环境中。在您的代码中,当下一个连接是 accepted 时,似乎前一个连接已经关闭。将代码放在一个线程中,并确保每个连接持续足够长的时间,以确保真正发生 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 的值,但没有义务实际限制未完成的连接。我假设这个规范与你使用的类似。 查看我的答案的修订版。

以上是关于听()忽略积压值的主要内容,如果未能解决你的问题,请参考以下文章

变频电源需要保养吗?不保养的危害有哪些呢

让 Jenkins 忽略 cmake 错误

解决protobuf忽略空返回值的问题

QT QItemSelectionModel 忽略列?

忽略脚本类型是一个好习惯吗? [复制]

如何使 pdist 忽略一个值(Matlab)