【socket】listen函数及backlog参数

173 篇文章 1 订阅
75 篇文章 1 订阅

man listen显示:

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

NAME

       listen - listen for connections on a socket

SYNOPSIS

       #include <sys/types.h>          /* See NOTES */
       #include <sys/socket.h>

       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 <sys/types.h>, 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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

109702008

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值