listen
函数用于将套接字标记为被动套接字,即用于接受客户端的连接请求。在 TCP 服务器端编程中,listen
函数通常紧随 bind
函数之后调用。下面是 listen
函数的详细解释:
#include <sys/socket.h>
int listen(int sockfd, int backlog);
-
sockfd
:- 是已经调用
bind
函数绑定了地址的套接字。 - 它标识了本地端点,即服务器要监听的端口。
- 是已经调用
-
backlog
:- 是在进入队列中等待被处理的连接的最大数量。
- 具体含义是,当有新的客户端连接请求时,如果已经有
backlog
个连接处于等待状态,新的连接请求将被拒绝。
示例用法:
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdio.h>
int main() {
// 创建套接字
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd == -1) {
perror("socket");
return -1;
}
// 填充服务器地址信息
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(8080);
server_addr.sin_addr.s_addr = INADDR_ANY;
// 绑定地址
if (bind(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)) == -1) {
perror("bind");
close(sockfd);
return -1;
}
// 将套接字标记为被动套接字,开始监听连接请求
if (listen(sockfd, 5) == -1) {
perror("listen");
close(sockfd);
return -1;
}
// 此时可以调用 accept 函数接受客户端连接请求
// ...
return 0;
}
在这个示例中,我们通过 socket
创建了套接字,然后使用 bind
将其绑定到特定的地址上。接着,调用 listen
将套接字标记为被动套接字,准备接受连接请求。listen
的第二个参数 backlog
指定了等待队列的最大长度。接下来,服务器可以调用 accept
函数来接受客户端的连接请求。