在 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=1024bash
ss -tulnp | grep LISTEN
# 或
netstat -tulnp | grep LISTENlisten 是 Linux TCP 服务器编程中的关键步骤,用于将套接字置于监听状态,准备接受客户端连接。合理设置 backlog 和系统参数对高并发场景尤为重要。