【问题标题】: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)。

标签: c sockets listen backlog


【解决方案1】:

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

listen()

这个answer 似乎覆盖了它。

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

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

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

【讨论】:

  • 在我的系统中 SOMAXCONN 设置为 128。那么如果我一次启动超过 128 个客户端会是什么行为。
  • 是的,规范说应该支持高达 128 的值,但没有义务实际限制未完成的连接。我假设这个规范与你使用的类似。
  • 查看我的答案的修订版。
猜你喜欢
  • 2010-12-10
  • 1970-01-01
  • 1970-01-01
  • 2014-02-27
  • 2014-11-07
  • 2017-04-27
  • 1970-01-01
  • 1970-01-01
  • 2019-10-14
相关资源
最近更新 更多