【socket】listen函数及backlog参数

man listen显示:

LISTEN(2)                                                                       Linux Programmer's Manual                                                                       LISTEN(2)

NAME
       listen - listen for connections on a socket

SYNOPSIS
       #include           /* See NOTES */
       #include 

       int listen(int sockfd, int backlog);

DESCRIPTION
       listen() marks the socket referred to by sockfd as a passive socket, that is, as a socket that will be used to accept incoming connection requests using accept(2).

       The sockfd argument is a file descriptor that refers to a socket of type SOCK_STREAM or SOCK_SEQPACKET.

       The backlog argument defines the maximum length to which the queue of pending connections for sockfd may grow.  If a connection request arrives when the queue is full, the client
       may receive an error with an indication of ECONNREFUSED or, if the underlying protocol supports retransmission, the request may be ignored so that a later reattempt at connection
       succeeds.

RETURN VALUE
       On success, zero is returned.  On error, -1 is returned, and errno is set appropriately.

ERRORS
       EADDRINUSE
              Another socket is already listening on the same port.

       EADDRINUSE
              (Internet  domain sockets) The socket referred to by sockfd had not previously been bound to an address and, upon attempting to bind it to an ephemeral port, it was deter‐
              mined that all port numbers in the ephemeral port range are currently in use.  See the discussion of /proc/sys/net/ipv4/ip_local_port_range in ip(7).

       EBADF  The argument sockfd is not a valid descriptor.

       ENOTSOCK
              The argument sockfd is not a socket.

       EOPNOTSUPP
              The socket is not of a type that supports the listen() operation.

CONFORMING TO
       4.4BSD, POSIX.1-2001.  The listen() function call first appeared in 4.2BSD.

NOTES
       To accept connections, the following steps are performed:

           1.  A socket is created with socket(2).

           2.  The socket is bound to a local address using bind(2), so that other sockets may be connect(2)ed to it.

           3.  A willingness to accept incoming connections and a queue limit for incoming connections are specified with listen().

           4.  Connections are accepted with accept(2).

       POSIX.1-2001 does not require the inclusion of , and this header file is not required on Linux.  However, some historical (BSD) implementations required this  header
       file, and portable applications are probably wise to include it.
       The  behavior of the backlog argument on TCP sockets changed with Linux 2.2.  Now it specifies the queue length for completely established sockets waiting to be accepted, instead
       of the number of incomplete connection requests.  The maximum length of the queue for incomplete sockets can be set using /proc/sys/net/ipv4/tcp_max_syn_backlog.  When syncookies
       are enabled there is no logical maximum length and this setting is ignored.  See tcp(7) for more information.

       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.

EXAMPLE
       See bind(2).

SEE ALSO
       accept(2), bind(2), connect(2), socket(2), socket(7)

COLOPHON
       This page is part of release 3.74 of the Linux man-pages project.  A description of the project, information about reporting bugs, and the latest version of  this  page,  can  be
       found at http://www.kernel.org/doc/man-pages/.

Linux                                                                                   2014-05-10                                                                              LISTEN(2)

将“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.”问chatGPT应用,答:

您提到的backlog参数被默默截断到/proc/sys/net/core/somaxconn的值的情况,讲述的是Linux网络编程中listen函数的一个重要细节。
listen函数的第二个参数backlog表示待处理连接队列的最大长度。
内核有两个限制:
1. /proc/sys/net/core/somaxconn:默认128,可以调整,表示listen队列全局的上限。
2. 内核源码中的宏SOMAXCONN:通常128,内核硬编码的listen队列长度上限。
所以如果backlog大于这两个限制中的较小值,会被截断到该值。
在Linux 2.4.25之前,只有硬编码的SOMAXCONN上限,默认128。
2.4.25引入了somaxconn文件可调整。但如果backlog大于somaxconn,仍会截断。
这是为了防止backlog过大导致内存耗尽。监听队列长度还与SYN攻击防范相关。
总之,设置listen时需要注意这两个限制,合理设定backlog大小,既不要太小,也不要超过系统默认限制。

参考:

socket通信之listen函数_socket listen_morris131的博客-CSDN博客

Linux socket的基本操作socket、bind、listen、accept - 知乎 (zhihu.com)

你可能感兴趣的:(C语言,编程,网络,网络,linux,c语言)