插件窝 干货文章 linux listen 什么意思

linux listen 什么意思

连接 套接字 listen backlog 255    来源:    2025-04-28

在 Linux 系统中,listen 是一个与网络编程密切相关的系统调用(system call),主要用于 TCP 网络通信。以下是详细解释:


1. listen 的作用

  • 功能:将套接字(socket)设置为 被动模式,使其能够接受来自客户端的连接请求。
  • 使用场景:在 TCP 服务器端编程中,listen 通常在 socket() 创建套接字和 bind() 绑定端口之后调用,为后续的 accept() 接收连接做准备。

2. 函数原型

c #include <sys/socket.h> int listen(int sockfd, int backlog); - 参数: - sockfd:通过 socket() 创建的套接字文件描述符。 - backlog:等待连接队列的最大长度(即允许挂起的未完成连接数)。 - 返回值:成功返回 0,失败返回 -1 并设置 errno


3. 关键说明

  • TCP 三次握手listen 会启动 TCP 的三次握手过程,但仅负责接收连接请求,实际建立连接由 accept() 完成。
  • backlog 的意义
    • 表示内核为套接字维护的未完成连接队列(SYN_RECEIVED 状态)和已完成连接队列(ESTABLISHED 状态)的总大小上限。
    • 现代内核可能自动调整此值(如 Linux 的 somaxconn 参数)。

4. 典型代码流程(服务器端)

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. 接受客户端连接


5. 常见问题

  • 错误 EADDRINUSE:绑定的端口已被占用(需检查 bind() 是否成功)。
  • 连接被拒绝backlog 设置过小可能导致高并发时连接丢失。
  • 内核参数调整bash # 查看当前 backlog 最大值 cat /proc/sys/net/core/somaxconn # 临时修改(需 root) sysctl -w net.core.somaxconn=1024

6. 相关命令

  • 查看监听中的端口: bash ss -tulnp | grep LISTEN # 或 netstat -tulnp | grep LISTEN

总结

listen 是 Linux TCP 服务器编程中的关键步骤,用于将套接字置于监听状态,准备接受客户端连接。合理设置 backlog 和系统参数对高并发场景尤为重要。