listen 返回后,是如何监听的

博客聚焦于listen返回后如何进行监听这一问题,围绕信息技术领域中监听机制展开探讨,旨在明确listen返回后的具体监听方式。
 listen 返回后,是如何监听的
在网络编程中,监听函数`listen`是服务端编程的重要组成部分,主要用于将服务端的主动描述符转为被动描述符,以监听客户端的连接请求。 ### 功能 连接请求只能由客户端发起,服务端的`socket`返回的“套接字文件描述符”默认是主动文件描述符,即主动向对方发送数据。而`listen`函数的作用就是将其转换为被动描述符,使其只能被动地等待别人主动发送数据并做出回应,从而用于监听客户端的连接[^1]。 ### 特性 `listen`函数不会阻塞,它只是把`socket`的属性更改为被动连接,使其可以接收其他进程的连接。在设置好`socket`的属性之后,`listen`函数就会返回监听的过程实质由操作系统完成。与之相对的是`accept`函数,它会阻塞(也可以设置为非阻塞),如果`listen`的套接字对应的连接请求队列为空(没有客户端连接请求),`accept`会一直阻塞等待[^2]。 ### 状态转换 当`socket`函数创建一个套接字时,它被假设为一个主动套接字,也就是将调用`connect`连接的客户套接字。调用`listen`函数会把一个连接的套接字转换成一个被动套接字,指示内核应该接受指向该套接字的连接请求,同时导致套接字从`CLOSED`状态转换到`LISTEN`状态[^4]。 ### 使用方法 在编写服务器端程序时,`listen`函数是其中的一个关键步骤,服务器端的编程流程通常为:`socket()` -> `bind()` -> `listen()` -> `accept()` -> `read()`/`write()` -> `close()`。具体如下: 1. `socket()`:创建套接字。 2. `bind()`:分配套接字地址。 3. `listen()`:使套接字进入等待连接请求状态。 4. `accept()`:允许连接。 5. `read()`/`write()`:进行数据交换。 6. `close()`:断开连接 [^3]。 以下是一个简单的C语言示例代码,展示了`listen`函数的使用: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <arpa/inet.h> #include <unistd.h> #define PORT 8888 int main(int argc, char const *argv[]) { int server_fd, new_socket; struct sockaddr_in address; int opt = 1; int addrlen = sizeof(address); // 创建套接字 if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) { perror("socket failed"); exit(EXIT_FAILURE); } // 设置套接字选项 if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) { perror("setsockopt"); exit(EXIT_FAILURE); } address.sin_family = AF_INET; address.sin_addr.s_addr = INADDR_ANY; address.sin_port = htons(PORT); // 分配套接字地址 if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) { perror("bind failed"); exit(EXIT_FAILURE); } // 监听连接请求 if (listen(server_fd, 3) < 0) { perror("listen"); exit(EXIT_FAILURE); } printf("Server listening on port %d...\n", PORT); // 后续可使用 accept 接受连接等操作 return 0; } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值