上一篇
在Linux网络编程中,处理多个客户端连接时,传统的多进程或多线程模型会消耗大量系统资源。IO多路复用技术允许单个进程同时监视多个文件描述符,一旦某个描述符就绪(可读、可写或异常),就能通知程序进行相应的读写操作。select函数是最早出现的IO多路复用接口之一,虽然它有一些局限性,但依然是学习Linux网络编程的基础,也是理解多路转接IO概念的入门钥匙。
select允许程序监视多个文件描述符的变化,并告诉我们哪些描述符已经准备好被读取、写入或发生异常。它的核心作用是避免在单个描述符上阻塞,实现同时处理多个连接。
#include #include int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); select返回就绪描述符的总数,超时返回0,出错返回-1。
fd_set是一个位图结构,我们需要用以下宏来操作它:
void FD_ZERO(fd_set *set); // 清空集合void FD_SET(int fd, fd_set *set); // 将fd加入集合void FD_CLR(int fd, fd_set *set); // 将fd从集合移除int FD_ISSET(int fd, fd_set *set); // 判断fd是否在集合中 #include #include #include #include #include #include #include int main() { int listen_fd, conn_fd, max_fd; struct sockaddr_in server_addr, client_addr; fd_set read_fds, all_fds; int client_fds[FD_SETSIZE] = {0}; // 存储所有客户端fd // 创建监听套接字 listen_fd = socket(AF_INET, SOCK_STREAM, 0); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = INADDR_ANY; server_addr.sin_port = htons(8888); bind(listen_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)); listen(listen_fd, 5); FD_ZERO(&all_fds); FD_SET(listen_fd, &all_fds); max_fd = listen_fd; while (1) { read_fds = all_fds; // 每次都要重新设置 if (select(max_fd + 1, &read_fds, NULL, NULL, NULL) < 0) { perror("select"); break; } for (int i = 0; i <= max_fd; i++) { if (FD_ISSET(i, &read_fds)) { if (i == listen_fd) { // 新连接 socklen_t len = sizeof(client_addr); conn_fd = accept(listen_fd, (struct sockaddr*)&client_addr, &len); FD_SET(conn_fd, &all_fds); if (conn_fd > max_fd) max_fd = conn_fd; printf("新客户端连接: %d", conn_fd); } else { // 客户端数据 char buf[1024]; int n = read(i, buf, sizeof(buf)); if (n <= 0) { // 客户端关闭或出错 close(i); FD_CLR(i, &all_fds); printf("客户端 %d 断开", i); } else { buf[n] = "�"; printf("收到来自 %d 的数据: %s", i, buf); write(i, buf, n); // 回射 } } } } } close(listen_fd); return 0;} 优点:跨平台性好(几乎所有的Unix系统都支持),使用简单,是学习IO多路复用的入门知识。
缺点:
select是Linux网络编程中经典的多路转接IO函数,尽管在现代高性能服务器中逐渐被epoll等替代,但它依然是理解IO多路复用原理的最佳起点。掌握select有助于深入学习其他更高效的IO模型。希望本教程能帮助小白读者入门select函数,并在实践中灵活运用。
本文由主机测评网于2026-02-24发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/20260226899.html