How to determine the value of socket listen() backlog parameter?
Asked Answered
S

3

40

How should I determine what to use for a listening socket's backlog parameter? Is it a problem to simply specify a very large number?

Sustain answered 22/9, 2008 at 13:29 Comment(2)
As a warning to anyone using boost asio, the SOMAXCONN value is used as 5 with boost.Sustain
I don't think Boost Asio defines this value per se. It has it's own constant, socket_base::max_listen_connections that is assigned the system SOMAXCONN value.Higginson
S
1

From the docs:

A value for the backlog of SOMAXCONN is a special constant that instructs the underlying service provider responsible for socket s to set the length of the queue of pending connections to a maximum reasonable value.

Skipp answered 22/9, 2008 at 13:37 Comment(3)
Terrible answer. What are such "reasonable values"?Scheers
I have to agree, this doesn't answer the question at all.Payroll
I disagree with the other comments. This is a perfectly good answer to the common question: "What the heck should I pass as the second parameter to listen()?" If you don't know, use SOMAXCONN.Trygve
C
36

There's a very long answer to this in the Winsock Programmer's FAQ. It details the standard setting, and the dynamic backlog feature added in a hotfix to NT 4.0.

One of the parameters to the listen() call sets the size of the connection backlog for a particular socket. When the backlog fills up, the stack begins rejecting connection attempts.

The proper value for listen()’s backlog parameter depends on how many connections you expect to see in the time between accept() calls.

The traditional value for listen()’s backlog parameter is 5. This is actually the limit on the home and workstation class versions of Windows.

If your program is quick about calling accept(), low backlog limits are not normally a problem.

You should not take advantage of the feature this way unless your connection rate is very low and the connection times are very short.

Calciferol answered 22/9, 2008 at 13:56 Comment(1)
If you're on a Linux box, see the listen manpage: "If the backlog argument is greater than the value in /proc/sys/net/core/somaxconn, then it is silently truncated to that value; the default value in this file is 128. In kernels before 2.4.25, this limit was a hard coded value, SOMAXCONN, with the value 128."Wenona
A
4

I second using SOMAXCONN, unless you have a specific reason to use a short queue.

Keep in mind that if there is no room in the queue for a new connection, no RST will be sent, allowing the client to automatically continue trying to connect by retransmitting SYN.

Also, the backlog argument can have different meanings in different socket implementations.

  • In most it means the size of the half-open connection queue, in some it means the size of the completed connection queue.
  • In many implementations, the backlog argument will multiplied to yield a different queue length.
  • If a value is specified that is too large, all implementations will silently truncate the value to maximum queue length anyways.
Alizaalizarin answered 22/9, 2008 at 14:3 Comment(0)
S
1

From the docs:

A value for the backlog of SOMAXCONN is a special constant that instructs the underlying service provider responsible for socket s to set the length of the queue of pending connections to a maximum reasonable value.

Skipp answered 22/9, 2008 at 13:37 Comment(3)
Terrible answer. What are such "reasonable values"?Scheers
I have to agree, this doesn't answer the question at all.Payroll
I disagree with the other comments. This is a perfectly good answer to the common question: "What the heck should I pass as the second parameter to listen()?" If you don't know, use SOMAXCONN.Trygve

© 2022 - 2024 — McMap. All rights reserved.