listen(2) - Linux 手册页

名称

listen - 监听 socket 的连接

概要

#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
int listen(int sockfd, int backlog);

描述

listen() 将由 sockfd 指示的 socket 标记为被动 socket,即,将用作使用 accept(2) 接受传入连接请求的 socket。

sockfd 参数是指向类型为 SOCK_STREAMSOCK_SEQPACKET 的 socket 的文件描述符。

backlog 参数定义了 sockfd 的待处理连接队列的最大长度。如果连接请求在队列已满时到达,客户端可能会收到一个带有 ECONNREFUSED 指示的错误,或者,如果底层协议支持重传,则该请求可能会被忽略,以便稍后的连接重试成功。

返回值

成功时返回零。出错时返回 -1,并相应地设置 errno

错误

EADDRINUSE
另一个 socket 已经在相同的端口上监听。
EBADF
参数 sockfd 不是有效的描述符。
ENOTSOCK
参数 sockfd 不是一个套接字。
EOPNOTSUPP
socket 的类型不支持 listen() 操作。

符合

4.4BSD, POSIX.1-2001。listen() 函数调用首次出现在 4.2BSD 中。

说明

要接受连接,执行以下步骤
1.
使用 socket(2) 创建一个 socket。
2.
使用 bind(2) 将 socket 绑定到本地地址,以便其他 socket 可以 connect(2) 到它。
3.
使用 listen() 指定接受传入连接的意愿和传入连接的队列限制。
4.
使用 accept(2) 接受连接。

POSIX.1-2001 不要求包含 <sys/types.h>,且在 Linux 上也不需要此头文件。然而,一些历史(BSD)实现需要此头文件,编写可移植应用程序时包含它是明智的。

在 TCP socket 上,backlog 参数的行为在 Linux 2.2 中发生了变化。现在它指定了等待被接受的 *完全* 建立的 socket 的队列长度,而不是未完成连接请求的数量。未完成 socket 队列的最大长度可以使用 /proc/sys/net/ipv4/tcp_max_syn_backlog 设置。当启用 syncookies 时,没有逻辑上的最大长度,并且此设置将被忽略。有关更多信息,请参阅 tcp(7)

如果 backlog 参数大于 /proc/sys/net/core/somaxconn 中的值,则它将被无声地截断为该值;此文件中的默认值为 128。在 2.4.25 之前的内核中,此限制是一个硬编码值,SOMAXCONN,其值为 128。

示例

参见 bind(2)

参见

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

引用自

accept4(2), cyrus-master(8), dictd(8), epoll(4), epoll(7), explain(1), explain(3), explain_listen(3), explain_listen_or_die(3), getpeereid(3), ip(7), mimedefang(8), mimedefang-multiplexor(8), proc(5), radmind(8), rfc1213-mib(7), rpc_svc_create(3), sctp(7), services(5), smtp-sink(1), socketcall(2)