如何确定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最大长度