Socket多路复用网络编程应用总结
Socket多路复用网络编程应用总结
概述
• 传统I/O模型的局限性:传统阻塞式I/O模型每次仅在一个文件描述符(File Descriptor, FD)上执行I/O操作,导致程序需等待单个操作完成,无法高效处理多连接场景(如高并发服务器)。
• 多路复用核心目标:通过非阻塞方式同时监控多个FD的状态(可读、可写、异常),避免进程因等待某个FD而阻塞,提升I/O效率。
Select技术
核心特点
- 非阻塞轮询:通过轮询机制主动检测FD集合的状态变化,无需阻塞等待单个FD。
- 多路复用机制:单线程/进程可管理多个I/O操作,适用于非阻塞式网络编程。
- 通用性:支持跨平台(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是否就绪。
编程流程
-
初始化FD集合:
fd_set read_fds; FD_ZERO(&read_fds); // 清空集合 FD_SET(sockfd, &read_fds); // 添加待监控的FD int max_fd = sockfd; // 记录最大FD
-
调用Select:
struct timeval timeout = {5, 0}; // 5秒超时 int ready = select(max_fd + 1, &read_fds, NULL, NULLtimeout);
-
处理结果:
• 错误处理:检查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 { // 处理客户端数据}} }
-
****:每次调用
select
后需重新初始化FD集合(因内核会修改集合)。
Select模型关键点
- 位掩码机制:
fd_set
通过位掩码表示FD集合(如FD=5对应第5位),最大FD数受FD_SETSIZE
限制(通常1024)。 - 性能瓶颈:需遍历所有FD,时间复杂度为O(n),不适用于海量连接。
- 适用场景:中小规模并发、跨平台兼容性要求高的情况。
实例场景(服务器端)
- 监听Socket:主Socket监听连接请求(如TCP端口)。
- 接受新连接:当
select
返回主Socket可读时,调用accept
接收客户端连接,并将新FD加入监控集合。 - 处理数据:遍历所有FD,若某个客户端FD可读,调用
recv
读取数据并处理。 - 异常处理:监控
exceptfds
处理连接异常(如断开)。
优缺点总结
• 优点:
• 跨平台支持。
• 代码简单,适合低并发场景。
• 缺点:
• FD数量受限(FD_SETSIZE
)。
• 每次调用需复制FD集合到内核,遍历开销大。
• 需频繁重置FD集合。
替代技术
• epoll(Linux):高效的事件通知机制,支持海量连接。
• kqueue(BSD/macOS):类似epoll,适用于BSD系统。
• IOCP(Windows):异步I/O模型,适用于Windows高性能服务器。
通过掌握select技术,开发者能够编写高效的非阻塞网络程序,理解其原理及局限性可为后续学习更高效的多路复用技术(如epoll)奠定基础。
相关文章:
Socket多路复用网络编程应用总结
Socket多路复用网络编程应用总结 概述 • 传统I/O模型的局限性:传统阻塞式I/O模型每次仅在一个文件描述符(File Descriptor, FD)上执行I/O操作,导致程序需等待单个操作完成,无法高效处理多连接场景(如高并…...
APT攻击阶段划分,每个阶段分区方法
根据现有资料,APT(高级持续性威胁)攻击的阶段划分主要基于两种主流模型:洛克希德-马丁的杀伤链模型和生命周期模型。以下是分阶段详解及分区依据: 一、洛克希德-马丁杀伤链模型(7阶段) 核心逻辑…...
图像颜色空间对比(Opencv)
1. 颜色转换 import cv2 import matplotlib.pyplot as plotimg cv2.imread("tmp.jpg") img_r cv2.cvtColor(img, cv2.COLOR_BGR2RGB) img_g cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) img_h cv2.cvtColor(img, cv2.COLOR_BGR2HSV) img_l cv2.cvtColor(img, cv2.C…...
【NLP 58、利用trl框架训练LLM】
孤独总比忍受傻逼好得多 —— 25.4.11 源代码网页: 项目文件预览 - trl:Train transformer language models with reinforcement learning. - GitCode TRL —— 变压器强化学习 trl:一个用于后训练基础模型的全面库 1.概述 TRL 是一个利用监督微调&a…...
数据仓库元数据的管理
元数据(Meta Date),主要记录数据仓库中模型的定义、各层级间的映射关系、监控数据仓库的数据状态 及ETL的任务运行状态。一般会通过元数据资料库(Metadata Repository)来统一地存储和管理元数据,其主要 目的…...
MySQL逻辑架构有什么?
1. MySQL逻辑架构分层 MySQL的逻辑架构可分为三层(自上而下): 连接层(Client Layer)服务层(Server Layer)存储引擎层(Storage Engine Layer) -----------------------…...
蓝桥杯 web 常用到的一些知识点
reduce 方法遍历数组、将数组元素累计 ①reduce接收两个参数,一个回调函数,一个初始值 ②回调函数传递了两个参数,一个是累加值,另一个是当前值 reduce的写法: arrays.reduce((a,cÿ…...
构建高可靠C++服务框架:从日志系统到任务调度器的完整实现
构建高可靠C服务框架:从日志系统到任务调度器的完整实现 一、深度解析示例代码技术体系 1.1 日志系统的进阶应用 示例代码中的ZRY_LOG_XXX宏展示了基础日志功能,但在生产环境中我们需要更完善的日志系统: 推荐技术栈组合: sp…...
<C#>在 C# .NET 中,使用 LoggerExtensions方法创建日志
在 C# .NET 中,LoggerExtensions 是 Microsoft.Extensions.Logging 命名空间下的一组扩展方法,它们为 ILogger 接口提供了便捷的日志记录方式。借助这些扩展方法,你能轻松记录不同级别的日志,如调试信息、信息、警告、错误等。下面…...
微服务与Spring Cloud Alibaba简介
微服务(或微服务架构)是一种云原生架构方法,其中单个应用程序由许多松散耦合且可独立部署的较小组件或服务组成。本单元主要介绍微服务架构的定义、微服务的特征、微服务架构面临的挑战、Spring Cloud 定义、Spring Cloud 核心组件、Spring C…...
元生代品牌建设:平台实现工作流(comfyui)创建与技术文档说明
本文摘要:蓝耘科技自2004年成立以来,从传统IT系统集成业务转型为聚焦GPU算力云服务的科技公司。其发布的元生代平台,是一个集算力调度、应用市场和AI协作开发为一体的智算云平台。用户可在蓝耘平台使用ComfyUI进行AI绘图,通过添加…...
无线通信网
1.2.4G相邻信道间有干扰,5G相邻信道几乎无干扰 2.2.4G频段的优点是信号强,衰减小,穿墙强,覆盖距离远;缺点是带宽较窄,速度较慢,干扰较大。 5G频段的优点是带宽较宽,速度较快&#…...
WMware虚拟机Ubuntu磁盘扩容
VMware中操作: 选择要扩容的虚拟机,点击编辑虚拟机设置 打开后点击磁盘——>点击扩展(注意:如果想要扩容的话需要删除快照) 调整到你想要的容量 点击上图的扩展——>确定 然后我们进到虚拟机里面 首先&#…...
vscode头文件自由跳转
文章目录 1. 安装c/c扩展2. 建.vscode文件夹 当你想要ctl鼠标左击跳转到三方库的定义的时候请往下看。 1. 安装c/c扩展 2. 建.vscode文件夹 在.vscode文件夹下新建c_cpp_properties.json {"configurations": [{"name": "Linux","include…...
BUG:Cannot find implementation for xxx. database. xxx. xxx_Impl does not exist
问题背景 使用Jetpack Compose将数据存储在room本地数据库时,编译报错: java. lang. RuntimeException: Cannot find implementation for com. example. androidproject. practice. roomdmeo. database. AppDatabase. AppDatabase_Impl does not exist …...
基于PySide6与pyCATIA的工程图智能文本替换工具开发指南
一、需求背景与实现价值 在汽车、航空等制造领域,CATIA工程图的文本标注管理常面临批量修改需求。传统手工操作存在效率低、易出错等问题。本文实现的文本替换工具具有以下行业价值: 提升图纸修订效率(单次操作可处理数千个文本对象&#x…...
MCP协议下人工智能康复理疗智械融合编程方向分析
一、引言:AI 康复时代的技术革新 在全球人口老龄化进程加速以及慢性病发病率持续走高的双重背景下,康复医疗领域正面临着前所未有的需求增长压力。据世界卫生组织(WHO)相关数据表明,预计到 2050 年,全球 60 岁及以上老年人口数量将激增至 21 亿,这一庞大群体中,绝大多…...
【嵌入式硬件】LAN9253说明书(中文版)
目录 1.介绍 1.1总体介绍 1.2模式介绍 1.2.1微控制器模式: 1.2.2 扩展模式 1.2.3 数字IO模式 1.2.4 各模式图 2.引脚说明 2.1 引脚总览 2.2 引脚描述 2.2.1 LAN端口A引脚 2.2.2 LAN端口B引脚 2.2.3 LAN端口A和、B电源和公共引脚 2.2.4 SPI/SQI PINS 2.2.5 分布式时…...
Java学习手册:Java基本语法与数据类型
Java语言以其简洁明了的语法和强大的数据类型系统而闻名。掌握Java的基本语法和数据类型是成为一名合格Java开发者的第一步。本文将深入探讨Java的基本语法结构和数据类型,帮助读者打下坚实的基础。 Java的基本语法 Java语言的语法设计简洁而强大,强调…...
操作系统 3.4-段页结合的实际内存管理
段与页结合的初步思路 虚拟内存的引入: 为了结合段和页的优势,操作系统引入了虚拟内存的概念。虚拟内存是一段地址空间,它映射到物理内存上,但对用户程序是透明的。 段到虚拟内存的映射: 用户程序中的段首先映射到虚…...
金融简单介绍及金融诈骗防范
在当今社会,金融学如同一股无形却强大的力量,深刻影响着我们生活的方方面面。无论是个人的日常收支、投资理财,还是国家的宏观经济调控,都与金融学紧密相连。 一、金融学的概念 金融学,简单来说,是研…...
基于docker搭建redis集群环境
在redis目录下创建redis-cluster目录,创建docker-compose.yml文化和generate.sh文件 【配置generate.sh文件】 for port in $(seq 1 9); \ do \ mkdir -p redis${port}/ touch redis${port}/redis.conf cat << EOF > redis${port}/redis.conf port 6379 …...
CSS 中常见的布局相关属性及其功能分类
一、块级布局(Block Layout) 1. display 作用:定义元素的显示方式。常用值: block:块级元素,默认独占一行。inline:行内元素,与其他内容在同一行显示。inline-block:兼…...
用css画一条弧线
ui里有一条弧线,现在用css实现 关键代码 border-bottom-left-radius: 100% 7px 两个参数分别代表横向和纵向的深度border-bottom-right-radius: 100% 7px...
CesiumForUnreal 本地矢量文件的加载,支持 shp/geojson 等常用格式
实现效果 Cesium for Unreal 集成 GDAL、LibPng 实现加载本地矢量文件 实现步骤 添加依赖在 cesium-unreal 中 extern -> cesium-native -> CMakeLists.txt 中的 57 行添加依赖库,代码如下: set(PACKAGES_PRIVATEabseil draco ktx modp-base64 meshoptimizer openssl …...
面向基于发布-订阅的物联网网络的匿名 MQTT 分析
中文标题: 面向基于发布-订阅的物联网网络的匿名 MQTT 分析 英文标题: An Analysis of Anonymous MQTT for Publish-Subscribe-Based IoT Networks 作者信息 Yudai Fukushima:东京都立大学电气工程与计算机科学系硕士生,研究方向…...
<C#> 详细介绍.NET 依赖注入
在 .NET 开发中,依赖注入(Dependency Injection,简称 DI)是一种设计模式,它可以增强代码的可测试性、可维护性和可扩展性。以下是对 .NET 依赖注入的详细介绍: 1. 什么是依赖注入 在软件开发里࿰…...
批量给文件编排序号,支持数字序号及时间日期序号编排文件
当我们需要对文件进行编号的时候,我们可以通过这个工具来帮我们完成,它可以支持从 001 到 100 甚至更多的数字序号编号。也可以支持按照日期、时间等方式对文件进行编号操作。这是一种操作简单,处理起来也非常的高效文件编排序号的方法。 工作…...
乳腺癌识别:双模型融合
本文为为🔗365天深度学习训练营内部文章 原作者:K同学啊 import matplotlib.pyplot as plt import tensorflow as tf import warnings as w w.filterwarnings(ignore) # 支持中文 plt.rcParams[font.sans-serif] [SimHei] # 用来正常显示中文标签 …...
ubuntu 22.04配置cuda和cudnn
cuda:12.1 wget https://developer.download.nvidia.com/compute/cuda/12.1.1/local_installers/cuda_12.1.1_530.30.02_linux.run sudo sh cuda_12.1.1_530.30.02_linux.runAbort/Continue选择Continue,不要勾选自带的driver 配置环境变量。~/.bashrc e…...
为什么Java不支持多继承?如何实现多继承?
一、前言 Java不支持多继承(一个类继承多个父类)主要出于文中设计考虑;核心目的是简化语言复杂性并避免潜在的歧义性问题。 二、直接原因:菱形继承/钻石继承问题(Diamond Problem) 假设存在如下继承关系&…...
ESP32S3 链接到 WiFi
以下是关于如何让 ESP32S3 连接到 WiFi 的完整流程和代码示例: ESP32S3 链接到 WiFi 1. 设置工作模式 ESP32 可以工作在两种模式下: Station (STA) 模式:作为无线终端连接到无线接入点(AP),类似于手机或…...
AndroidTV D贝桌面-v3.2.5-[支持文件传输]
AndroidTV D贝桌面 链接:https://pan.xunlei.com/s/VONXSBtgn8S_BsZxzjH_mHlAA1?pwdzet2# AndroidTV D贝桌面-v3.2.5[支持文件传输] 第一次使用的话,壁纸默认去掉的,不需要按遥控器上键,自己更换壁纸即可...
在spark中,窄依赖算子map和filter会组合为一个stage,这种情况下,map和filter是在一个task内进行的吗?
在 Spark 中,当 map 和 filter 这类窄依赖(Narrow Dependency)的算子连续应用时,它们会被合并到同一个 Stage 中,并且在同一个 Task 内按顺序执行。这种优化称为 流水线(Pipeline)执行ÿ…...
展讯android15源码编译之apk单编
首先找到你要单编的apk生成的路径: sys\out_system\target\product\ussi_arm64\system_ext\app\HelloDemo\HelloDemo.apk接着打开下面这个文件: sys\out_system\ussi_arm64_full-userdebug-gms.system.build.log在里面找关键字"Running command&q…...
EtherCAT 转 ModbusTCP 网关
一、功能概述 1.1 设备简介 本产品是 EtherCAT 和 Modbus TCP 网关,使用数据映射方式工作。 本产品在 EtherCAT 侧作为 EtherCAT 从站,接 TwinCAT 、 CodeSYS 、 PLC 等;在 ModbusTCP 侧做为 ModbusTCP 主站( C…...
SpringBoot集成阿里云文档格式转换实现pdf转换word,excel
一、前置条件 1.1 创建accessKey 如何申请:https://help.aliyun.com/zh/ram/user-guide/create-an-accesskey-pair 1.2 开通服务 官方地址:https://docmind.console.aliyun.com/doc-overview 未开通服务时需要点击开通按钮,然后才能调用…...
大数据-271 Spark MLib - 基础介绍 机器学习算法 线性回归 场景 定义 损失 优化
点一下关注吧!!!非常感谢!!持续更新!!! Java篇开始了! MyBatis 更新完毕目前开始更新 Spring,一起深入浅出! 目前已经更新到了: H…...
ubuntu不生成core文件的处理
1、设置unlimited ulimit -a 查看是否设置,没有设置的使用下面命令设置 ulimit -c unlimited这个设置只在当前会话有效,添加到 ~/.bashrc 中,重开终端生效 2、sysctl配置 修改 /etc/sysctl.conf 文件 ,增加以下两个配置&#…...
游戏服务器DDoS攻防实战指南——从攻击溯源到智能防护体系构建
本文深度解析游戏行业DDoS攻防技术演进路线,基于等保2.0与NIST框架,从攻击流量识别、弹性防护架构、智能调度算法三大维度,揭示游戏服务器防护体系的23个关键控制点。通过近期《永劫无间》服务器瘫痪事件复盘,结合Gartner最新混合…...
JAVA 导出 word
1、模板方式导出 1.1、引入 maven 依赖 <dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.12.2</version> </dependency>1.2、导出文档代码 public static void main(String[] args…...
OpenHarmony 5.0版本视频硬件编解码适配
一、简介 Codec HDI(Hardware Device Interface)对上层媒体服务提供视频编解码的驱动能力接口,主要功能有获取组件编解码能力,创建、销毁编解码器对象,启停编解码器操作,编解码处理等。 Codec HDI 2.0接口…...
《Python星球日记》第23天:Pandas基础
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 订阅专栏:《Python星球日记》 目录 一、Pandas 简介1. 什么是 Pandas&…...
ubuntu22.04下安装mysql以及mysql-workbench
一、mysql安装以及配置 安装之前先查看是否已将安装mysql: rpm -qa | grep mysql (一)、在线安装 保证网络正常的情况下: 1、更新软件包: sudo apt update 2、安装mysql安装包 查看可以安装的安装包: sudo apt search mysql-server 安装指定安装包: sudo apt i…...
让 Python 脚本在后台持续运行:架构级解决方案与工业级实践指南
让 Python 脚本在后台持续运行:架构级解决方案与工业级实践指南 一、生产环境需求全景分析 1.1 后台进程的工业级要求矩阵 维度开发环境要求生产环境要求容灾要求可靠性单点运行集群部署跨机房容灾可观测性控制台输出集中式日志分布式追踪资源管理无限制CPU/Memo…...
设计模式 四、行为设计模式(2)
五、状态模式 1、概述 状态设计模式是一种行为型设计模式,它允许对象在其内部状态发生时改变其行为,这种模式可以消除大量的条件语句,并将每个状态的行为封装到单独的类中。 状态模式的主要组成部分如下: 1)上…...
C++中作用域(public,private,protected
在C中,public、private 和 protected 是用于控制类成员(变量和函数)访问权限的关键字。它们决定了类成员在代码中的可见性和可访问性。在学习时候,对于public是最容易理解的,对于private也好理解,但是对于p…...
Spring配置方式演进:从XML到注解,构建灵活高效的开发体系
Spring配置方式演进:从XML到注解,构建灵活高效的开发体系 在Spring框架的演进长河中,配置方式始终是开发者需要掌握的核心技能。从早期XML一统天下的严谨规范,到注解驱动的敏捷开发,再到如今Java Config的优雅实践&am…...
网络4 OSI7层
OSI七层模型:数据如何传送,向下传送变成了什么样子 应用层 和用户打交道,向用户提供服务。 例如:web服务、http协议、FTP协议 1.用户接口 2.提供各种服务 通过浏览器(接口)提供Web服务 表示层 翻译 我的“…...
前端请求设置credentials: ‘include‘导致的cors问题
1.背景 前端请求设置credentials: ‘include‘其实主要是为了发送凭证,传cookie给后端 2.前端请求 fetch(http://frontend.com, { method: GET, // 或其他HTTP方法 credentials: include, // 不携带凭证 headers: { Content-Type: application/json, }, })…...