【问题标题】:How to determine the value of socket listen() backlog parameter?如何确定socket listen() backlog 参数的值?
【发布时间】:2010-09-12 00:11:05
【问题描述】:

我应该如何确定监听套接字的 backlog 参数使用什么?简单地指定一个非常大的数字会不会有问题?

【问题讨论】:

  • 作为对使用 boost asio 的任何人的警告,SOMAXCONN 值在 boost 中被用作 5。
  • 我不认为 Boost Asio 本身定义了这个值。它有自己的常量socket_base::max_listen_connections,它被分配了系统 SOMAXCONN 值。

标签: c++ c sockets tcp listen


【解决方案1】:

来自docs

SOMAXCONN 的 backlog 值是一个特殊的常量,它指示负责 socket s 的底层服务提供者将挂起连接的队列长度设置为最大合理值。

【讨论】:

  • 糟糕的答案。什么是这样的“合理价值观”?
  • 我必须同意,这根本不能回答问题。
  • 我不同意其他 cmets。这是对常见问题的完美回答:“我到底应该将什么作为第二个参数传递给 listen()?”如果您不知道,请使用 SOMAXCONN。
【解决方案2】:

Winsock Programmer's FAQ 中有一个很长的答案。它详细介绍了标准设置,以及在 NT 4.0 的修补程序中添加的动态积压功能。

【讨论】:

  • 该常见问题解答中的绝妙答案;感谢分享。推荐。
  • 如果您使用的是 Linux 机器,请参阅 listen 手册页:“如果 backlog 参数大于 /proc/sys/net/core/somaxconn 中的值,那么它将被静默截断为该值;默认此文件中的值为 128。在 2.4.25 之前的内核中,此限制是硬编码值 SOMAXCONN,值为 128。"
【解决方案3】:

我第二次使用 SOMAXCONN,除非您有特定原因使用短队列。

请记住,如果队列中没有空间用于新连接,则不会发送 RST,允许客户端通过重新传输 SYN 自动继续尝试连接。

另外,backlog 参数在不同的套接字实现中可以有不同的含义。

  • 在大多数情况下表示半开连接队列的大小,在某些情况下表示已完成连接队列的大小。
  • 在许多实现中,积压参数将相乘以产生不同的队列长度。
  • 如果指定的值太大,所有实现都会默默地将值截断为最大队列长度。

【讨论】:

    猜你喜欢
    • 2011-07-03
    • 1970-01-01
    • 2015-07-04
    • 1970-01-01
    • 2015-10-15
    • 2018-06-22
    • 2020-08-24
    • 2012-10-26
    相关资源
    最近更新 更多