如何确定socket listen() backlog 参数的值?

Posted

技术标签:

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

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

【问题讨论】:

作为对使用 boost asio 的任何人的警告,SOMAXCONN 值在 boost 中被用作 5。 我不认为 Boost Asio 本身定义了这个值。它有自己的常量socket_base::max_listen_connections,它被分配了系统 SOMAXCONN 值。 【参考方案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 参数在不同的套接字实现中可以有不同的含义。

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

【讨论】:

以上是关于如何确定socket listen() backlog 参数的值?的主要内容,如果未能解决你的问题,请参考以下文章

手把手写C++服务器(24):socket响应一般框架TCP修改缓冲区内核监听listen最大长度

Python socket.listen(...)

Python干货socket中的listen()参数(数字)到底代表什么?

Socket之bind、listen实现

PHP socket_listen() 不工作

缓存服务器syns to listen sockets drop导致创建socket失败