listen - listen for connections on a socket
#include <sys/socket.h>
int listen(int sockfd, int backlog);
listen() 将 sockfd
引用的套接字标记为被动套接字,即,将用于accept(2)以接收新的连接请求(作为accept()的第一个参数)。被listen过的socket fd将不会再用于读写数据,而是用于accept创建新的socket fd,级创建一个新的连接,然后将使用新创建socket fd在TCP连接中发送或接受数据,这可能就是所谓的被动吧。
sockfd 参数是一个文件描述符,它引用 SOCK_STREAM 或 SOCK_SEQPACKET 类型的套接字。由此可知,listen()、accept()等仅仅用于数据流协议。
backlog
参数定义了 sockfd 的挂起连接队列的最大长度。 如果连接请求在队列已满时到达,客户端可能会收到一个带有 ECONNREFUSED 指示的错误,或者,如果底层协议支持重传,则该请求可能会被忽略,以便稍后重新尝试连接成功。对于backlog
参数,可参考TCP Socket数据的接收和发送中的相关讨论。
成功时,返回零。 出错时,返回 -1,并设置 errno 以指示错误。
-
EADDRINUSE
另一个套接字已经在同一个端口上侦听。 -
EADDRINUSE
(Internet 域套接字)sockfd
引用的套接字以前未绑定到地址,(即没有执行过bind()操作,此时listen会将其绑定到临时的端口上),并且在尝试将其绑定到临时端口时,确定临时端口范围内的所有端口号当前都在使用中。 请参阅 ip(7) 中对 /proc/sys/net/ipv4/ip_local_port_range 的讨论。 -
EBADF
参数sockfd
不是有效的文件描述符。 -
ENOTSOCK
文件描述符sockfd
没有引用套接字。 -
EOPNOTSUPP
套接字不是支持 listen() 操作的类型。
POSIX.1-2001, POSIX.1-2008, 4.4BSD (listen() first appeared in 4.2BSD).
要接受连接,需要执行以下步骤:
- 使用socket(2) 创建一个socket。
- 套接字使用 bind(2) 绑定到本地地址,以便其他套接字可以连接 (2) 到它。
- 使用listen()指定接收传入连接的意愿和传入连接的队列限制。
- 通过accept(2) 接受连接。
在 Linux 2.2 中,TCP 套接字上的 backlog
参数的行为发生了变化。 现在它指定等待接受的完全建立的套接字(completely established sockets)的队列长度,而不是未完成的连接请求(incomplete connection requests)的数量。 可以使用 /proc/sys/net/ipv4/tcp_max_syn_backlog 设置不完整套接字队列的最大长度。 启用 syncookies 时,没有逻辑最大长度,此设置将被忽略。 有关更多信息,请参阅 tcp(7)。
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.
如果 backlog
参数大于 /proc/sys/net/core/somaxconn 中的值,则它会被静默限制为该值。 从 Linux 5.4 开始,此文件中的默认值为 4096; 在早期内核中,默认值为 128。在 2.4.25 之前的内核中,此限制是一个硬编码值 SOMAXCONN,值为 128。
If the backlog argument is greater than the value in /proc/sys/net/core/somaxconn, then it is silently capped to that value. Since Linux 5.4, the default in this file is 4096; in earlier kernels, the default value is 128. In kernels before 2.4.25, this limit was a hard coded value, SOMAXCONN, with the value 128.
网友评论