Socket多路复用网络编程应用总结

Socket多路复用网络编程应用总结

概述

传统I/O模型的局限性:传统阻塞式I/O模型每次仅在一个文件描述符(File Descriptor, FD)上执行I/O操作,导致程序需等待单个操作完成,无法高效处理多连接场景(如高并发服务器)。
多路复用核心目标:通过非阻塞方式同时监控多个FD的状态(可读、可写、异常),避免进程因等待某个FD而阻塞,提升I/O效率。


Select技术
核心特点
  1. 非阻塞轮询:通过轮询机制主动检测FD集合的状态变化,无需阻塞等待单个FD。
  2. 多路复用机制:单线程/进程可管理多个I/O操作,适用于非阻塞式网络编程。
  3. 通用性:支持跨平台(Linux/Windows),但性能在大规模FD时受限。
Select函数详解
#include <sys/select.h>
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);

参数
nfds: 监控的FD最大值+1(如监控FD=5,则nfds=6)。
readfds/writefds/exceptfds: 可读、可写、异常事件的FD集合。
timeout: 超时时间(NULL表示阻塞,0表示非阻塞,>0为等待时间)。
返回值
• 成功:就绪的FD总数。
• 超时:返回0。
• 错误:返回-1,错误码存于errno

关键宏操作

FD_ZERO(fd_set *set): 清空集合。
FD_SET(int fd, fd_set *set): 添加FD到集合。
FD_CLR(int fd, fd_set *set): 从集合移除FD。
FD_ISSET(int fd, fd_set *set): 检查FD是否就绪。


编程流程
  1. 初始化FD集合

    fd_set read_fds;
    FD_ZERO(&read_fds);  // 清空集合
    FD_SET(sockfd, &read_fds); // 添加待监控的FD
    int max_fd = sockfd; // 记录最大FD
    
  2. 调用Select

    struct timeval timeout = {5, 0}; // 5秒超时
    int ready = select(max_fd + 1, &read_fds, NULL, NULLtimeout);
    
  3. 处理结果
    错误处理:检查ready == -1,处理信号中断或错误。
    超时处理ready == 0时执行超时逻辑。
    就绪处理:遍历所有FD,使用FD_ISSET检测就绪的FD:

    for (int fd = 0; fd <= max_fd; fd++) {if (FD_ISSET(fd, &read_fds)) {if (fd == sockfd) { // 处理新连接} else { // 处理客户端数据}}
    }
    
  4. ****:每次调用select后需重新初始化FD集合(因内核会修改集合)。


Select模型关键点
  1. 位掩码机制fd_set通过位掩码表示FD集合(如FD=5对应第5位),最大FD数受FD_SETSIZE限制(通常1024)。
  2. 性能瓶颈:需遍历所有FD,时间复杂度为O(n),不适用于海量连接。
  3. 适用场景:中小规模并发、跨平台兼容性要求高的情况。

实例场景(服务器端)
  1. 监听Socket:主Socket监听连接请求(如TCP端口)。
  2. 接受新连接:当select返回主Socket可读时,调用accept接收客户端连接,并将新FD加入监控集合。
  3. 处理数据:遍历所有FD,若某个客户端FD可读,调用recv读取数据并处理。
  4. 异常处理:监控exceptfds处理连接异常(如断开)。

优缺点总结

优点
• 跨平台支持。
• 代码简单,适合低并发场景。
缺点
• FD数量受限(FD_SETSIZE)。
• 每次调用需复制FD集合到内核,遍历开销大。
• 需频繁重置FD集合。


替代技术

epoll(Linux):高效的事件通知机制,支持海量连接。
kqueue(BSD/macOS):类似epoll,适用于BSD系统。
IOCP(Windows):异步I/O模型,适用于Windows高性能服务器。


通过掌握select技术,开发者能够编写高效的非阻塞网络程序,理解其原理及局限性可为后续学习更高效的多路复用技术(如epoll)奠定基础。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/76540.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安卓开发提示Android Gradle plugin错误

The project is using an incompatible version (AGP 8.9.1) of the Android Gradle plugin. Latest supported version is AGP 8.8.0-alpha05 See Android Studio & AGP compatibility options. 改模块级 build.gradle&#xff08;如果有独立配置&#xff09;&#xff1a;…

【C++初阶】--- vector容器功能模拟实现

1.什么是vector&#xff1f; 在 C 里&#xff0c;std::vector 是标准模板库&#xff08;STL&#xff09;提供的一个非常实用的容器类&#xff0c;它可以看作是动态数组 2.成员变量 iterator _start;&#xff1a;指向 vector 中第一个元素的指针。 iterator _finish;&#x…

分布式锁在秒杀场景中的Python实现与CAP权衡

目录 一、分布式锁的前世今生 二、秒杀系统的 “硬核” 挑战 三、Python 实现分布式锁的 “实战演练” Redis 实现:快准狠 ZooKeeper 实现:稳如老狗 数据库实现:老实本分 四、CAP 理论的 “三角恋” 五、性能优化的 “锦囊妙计” 锁粒度控制:粗细有道 超时机制:别…

企业级开发SpringBoost玩转Elasticsearch

案例 Spring Boot 提供了 spring-data-elasticsearch 模块&#xff0c;可以方便地集成 Elasticsearch。 下面我们将详细讲解如何在 Spring Boot 中使用 Elasticsearch 8&#xff0c;并提供示例代码。 1. 添加依赖: 首先&#xff0c;需要在 pom.xml 文件中添加 spring-data-e…

磐石云智能语音客服系统——技术革新引领服务新体验

在人工智能技术飞速发展的今天&#xff0c;企业对于智能化客户服务的需求日益增长。磐石云智能语音客服系统凭借其前沿技术架构与深度场景适配能力&#xff0c;正在重新定义人机交互的边界。本文将深入解析该系统如何通过技术创新实现服务效率与体验的双重突破。 一、意图识别…

OpenGL学习笔记(assimp封装、深度测试、模板测试)

目录 模型加载Assimp网格模型及导入 深度测试深度值精度深度缓冲的可视化深度冲突 模板测试物体轮廓 GitHub主页&#xff1a;https://github.com/sdpyy1 OpenGL学习仓库:https://github.com/sdpyy1/CppLearn/tree/main/OpenGLtree/main/OpenGL):https://github.com/sdpyy1/CppL…

通过AWS EKS 生成并部署容器化应用

今天给大家分享一个实战例子&#xff0c;如何在EKS上创建容器化应用并通过ALB来发布。先介绍一下几个基本概念&#xff1a; IAM, OpenID Connect (OIDC) 2014 年&#xff0c;AWS Identity and Access Management 增加了使用 OpenID Connect (OIDC) 的联合身份支持。此功能允许…

入侵检测snort功能概述

1. 数据包嗅探与日志记录 网络流量监控&#xff1a;实时捕获和分析网络数据包&#xff08;支持以太网、无线等&#xff09;。 日志记录&#xff1a;将数据包以二进制格式&#xff08;pcap&#xff09;或文本格式存储&#xff0c;供后续分析。 2. 协议分析与解码 深度协议解析…

【Easylive】定时任务-每日数据统计和临时文件清理

【Easylive】项目常见问题解答&#xff08;自用&持续更新中…&#xff09; 汇总版 这个定时任务系统主要包含两个核心功能&#xff1a;每日数据统计和临时文件清理。下面我将详细解析这两个定时任务的实现逻辑和技术要点&#xff1a; Component Slf4j public class SysTas…

蓝桥杯 15g

班级活动 问题描述 小明的老师准备组织一次班级活动。班上一共有 nn 名 (nn 为偶数) 同学&#xff0c;老师想把所有的同学进行分组&#xff0c;每两名同学一组。为了公平&#xff0c;老师给每名同学随机分配了一个 nn 以内的正整数作为 idid&#xff0c;第 ii 名同学的 idid 为…

如何使用AI辅助开发R语言

R语言是一种用于统计计算和图形生成的编程语言和软件环境&#xff0c;很多学术研究和数据分析的科学家和统计学家更青睐于它。但对与没有编程基础的初学者而言&#xff0c;R语言也是有一定使用难度的。不过现在有了通义灵码辅助编写R语言代码&#xff0c;我们完全可以用自然语言…

CISCO组建RIP V2路由网络

1.实验准备&#xff1a; 2.具体配置&#xff1a; 2.1根据分配好的IP地址配置静态IP&#xff1a; 2.1.1PC配置&#xff1a; PC0&#xff1a; PC1&#xff1a; PC2&#xff1a; 2.1.2路由器配置&#xff1a; R0&#xff1a; Router>en Router#conf t Enter configuration…

React + TipTap 富文本编辑器 实现消息列表展示,类似Slack,Deepseek等对话框功能

经过几天折腾再折腾&#xff0c;弄出来了&#xff0c;弄出来了&#xff01;&#xff01;&#xff01; 消息展示 在位编辑功能。 两个tiptap实例1个用来展示 消息列表&#xff0c;一个用来在位编辑消息。 tiptap灵活富文本编辑器&#xff0c;拓展性太好了!!! !!! 关键点&#x…

Ubuntu搭建Pytorch环境

Ubuntu搭建Pytorch环境 例如&#xff1a;第一章 Python 机器学习入门之pandas的使用 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 Ubuntu搭建Pytorch环境前言一、Anaconda二、Cuda1.安装流程2、环境变量&#…

Sping Cloud配置和注册中心

1.Nacos实现原理了解吗&#xff1f; Nacos是注册中心&#xff0c;主要是帮助我们管理服务列表。Nacos的实现原理大概可以从下面三个方面来讲&#xff1a; 服务注册与发现&#xff1a;当一个服务实例启动时&#xff0c;它会向Nacos Server发送注册请求&#xff0c;将自己的信息…

C++笔记之父类引用是否可以访问到子类特有的属性?

C++笔记之父类引用是否可以访问到子类特有的属性? code review! 参考笔记 1.C++笔记之在基类和派生类之间进行类型转换的所有方法 文章目录 C++笔记之父类引用是否可以访问到子类特有的属性?1.主要原因2.示例代码3.说明4.如何访问子类特有的属性5.注意事项6.总结在 C++ 中,…

JavaScript逆向工程:如何判断对称加密与非对称加密

在现代Web应用安全分析中&#xff0c;加密算法的识别是JavaScript逆向工程的关键环节。本文将详细介绍如何在逆向工程中判断JavaScript代码使用的是对称加密还是非对称加密。 一、加密算法基础概念 1. 对称加密 (Symmetric Encryption) 特点&#xff1a;加密和解密使用相同的…

物理备份工具 BRM vs gs_probackup

什么是BRM 上一篇文章讲了openGauss的物理备份工具gs_probackup&#xff0c;今天来说说BRM备份工具。 BRM备份恢复工具全称为&#xff1a;Backup and Recovery Manager&#xff0c;是MogDB基于opengauss的备份工具 gs_probackup 做了一些封装和优化,面向MogDB数据库实现备份和…

问问lua怎么写DeepSeek,,,,,

很坦白说&#xff0c;这十年&#xff0c;我几乎没办法从互联网找到这个这样的代码&#xff0c;互联网引擎找不到&#xff0c;我也没有很大的“追求”要传承&#xff0c;或者要宣传什么&#xff1b;直到DeepSeek的出现 兄弟&#xff0c;Deepseek现在已经比你更了解你楼下的超市…

react+Tesseract.js实现前端拍照获取/选择文件等文字识别OCR

需求背景 在开发过程中可能会存在用户上传一张图片后下方需要自己识别出来文字数字等信息&#xff0c;有的时候会通过后端来识别后返回&#xff0c;但是也会存在纯前端去识别的情况&#xff0c;这个时候就需要使用到Tesseract.js这个库了 附Tesseract.js官方&#xff08;htt…