在 Linux 系统中,listen
是一个与网络编程密切相关的系统调用(system call),主要用于 TCP 网络通信。以下是详细解释:
listen
的作用listen
通常在 socket()
创建套接字和 bind()
绑定端口之后调用,为后续的 accept()
接收连接做准备。c
#include <sys/socket.h>
int listen(int sockfd, int backlog);
- 参数:
- sockfd
:通过 socket()
创建的套接字文件描述符。
- backlog
:等待连接队列的最大长度(即允许挂起的未完成连接数)。
- 返回值:成功返回 0
,失败返回 -1
并设置 errno
。
listen
会启动 TCP 的三次握手过程,但仅负责接收连接请求,实际建立连接由 accept()
完成。backlog
的意义:
somaxconn
参数)。c
int sockfd = socket(AF_INET, SOCK_STREAM, 0); // 1. 创建套接字
bind(sockfd, (struct sockaddr*)&addr, sizeof(addr)); // 2. 绑定地址
listen(sockfd, 5); // 3. 开始监听,backlog=5
int client_fd = accept(sockfd, NULL, NULL); // 4. 接受客户端连接
EADDRINUSE
:绑定的端口已被占用(需检查 bind()
是否成功)。backlog
设置过小可能导致高并发时连接丢失。bash
# 查看当前 backlog 最大值
cat /proc/sys/net/core/somaxconn
# 临时修改(需 root)
sysctl -w net.core.somaxconn=1024
bash
ss -tulnp | grep LISTEN
# 或
netstat -tulnp | grep LISTEN
listen
是 Linux TCP 服务器编程中的关键步骤,用于将套接字置于监听状态,准备接受客户端连接。合理设置 backlog
和系统参数对高并发场景尤为重要。