当前位置: 首页 > news >正文

c++应用网络编程之五Windows常用的网络IO模型

一、Windows的网络编程

其实对开发者而言,只有Windows和其它平台。做为一种普遍流行的图形OS,其一定会与类Linux的编程有着明显的区别,这点当然也会体现在网络编程上。Windows有着自己一套相对独立的上层Socket编程模型或者说框架,而且这么多年来,没有再看到有革命性的模型或者框架出现,这也是在Windows上进行网络编程的一个优势。同时,由于其的闭源性,使得其它许多想by pass的技术,只能由微软自己的主导,从而导致技术进步的缓慢甚至没有推动的动力。

二、Windows常用的IO模型

在Windows平台上,其通用的IO模型与前面分析的一致,但在一些常用的网络IO模型上,则可以分为以下几种:
1、select模型
其函数接口如下:

int WSAAPI select{int nfds;fd_set *readfds;fd_set *writefds;fd_set *exceptfds;const timeval *timeout;
};

此select模型和Linux平台上的select模型基本类似,只是有个别参数的设置可能略有不同,比如第一个参数“int nfds”,在Windows平台上无意义,而在Linux表示监控最大的句柄数,不过不影响具体的功能。其应用场景和缺点也是小并发,在高并发时,效率可能会急剧降低。
2、WSAAsyncSelect模型
其函数接口定义如下:

int WSAAsyncSelect([in] SOCKET s,[in] HWND   hWnd,[in] u_int  wMsg,[in] long   lEvent
);

此模型主要是为了适应Windows的消息通知机制。可能没有写过Windows编程的不知道,在Windows系统上,UI的通信基本都是消息方式传递的,宏定义基本以WM_XXX开头。它的缺点自然也就带着消息的缺点,一是消息自身的限制,如队列的大小、同步非同步以及需要有UI线程等,二是可能会丢失。所以其性能仍然比较低,需要较为复杂的UI线程共同处理。它也不适合高并的客户端连接。

3、WSAEventSelect模型
其函数接口定义如下:

int WSAAPI WSAEventSelect([in] SOCKET   s,[in] WSAEVENT hEventObject,[in] long     lNetworkEvents
);

一般来说,事件的处理都是有上限限制的,毕竟事件的机制受内核限制的。所以使用此模型,一个线程处理的事件上限为64个。它的优点在于支持事件编程,这个在Windows上是有专门的接口的。
其它应用场景也是中低并发场景,一般不宜超过百的量级。
4、重叠(overlapped)模型
这玩意儿其实就是异步IO的一种实现(重叠就是多个IO在一起被工作)。也就是常理解的IO与实际的操作分离。这样导致的结果就是可以利用多个线程的复用来管理大批的IO操作。即业务是业务,IO是IO。而非是同步IO中的线程与IO同步,造成线程的浪费。在Windows平台上提供了waitformultipleobjects和waitforsingleobject两个函数来处理对IO的监听。
它的优点很明显,对并发量处理上去了,但实际上,仍然在大量线程操作大量IO操作时,会产生不小的资源浪费,比如到了千以上级。
它的数据结构和相关函数定义如下:

typedef struct _WSAOVERLAPPED {DWORD    Internal;DWORD    InternalHigh;DWORD    Offset;DWORD    OffsetHigh;WSAEVENT hEvent;
} WSAOVERLAPPED, *LPWSAOVERLAPPED;
BOOL WSAAPI WSAGetOverlappedResult([in]  SOCKET          s,[in]  LPWSAOVERLAPPED lpOverlapped,[out] LPDWORD         lpcbTransfer,[in]  BOOL            fWait,[out] LPDWORD         lpdwFlags
);

5、完成端口模型(IOCP)
如果弄明白了上面的重叠IO,就很容易理解IOCP(Completion Port)。重叠IO需要人为的处理上层应用线程和下层的异步IO调度,这本身就是一个非常复杂和非常有难度的问题。小数量并发时,不会体现出来。不过也不会用IOCP,但在大数量时,这个现象就非常突出了。所以Windows自己提供了一套线程和数据队列的管理机制,用来处理异步IO与上层线程池的的数据交换和管理。
它的优点非常明显,可以非常好的平衡多线程和IO之间的平衡并在此过程中取得最大的优化。缺点也非常明显,复杂,不好调试。
下面看一下创建完成端口的函数:

HANDLE WINAPI CreateIoCompletionPort(_In_     HANDLE    FileHandle,_In_opt_ HANDLE    ExistingCompletionPort,_In_     ULONG_PTR CompletionKey,_In_     DWORD     NumberOfConcurrentThreads
);

使用完成端口还需要其它函数,这里不再介绍,待专门写完成端口时再进行分析和说明。

值得一提的是,其实上述的模型也属于IO多路复用的模型,就看从什么角度来划分了。另外,Windows平台上对传统的Socket进行了一系列的封装,这些封装可能对初学者来说不太友好,需要一个学习和适应的过程。

三、比较分析

WSAAsyncSelect和WSAEventSelect在底层的机制基本一是类似的。不同的在于得到网络通知时,一个用来使用Windows的消息机制,一个使用的是Windows的事件机制。很多没有在Windows上开发过的开发者可能不明白二者的不同。不过这不难,用到的时候儿仔细看一下即可。
overlapped模型实际中看到的应用非常少,也可能是经历比较少吧。但确实在开源的库和框架里也很罕见。它有点类似于IOCP出现前的一个半成品,IOCP出现后,小并发的基本前面几个模型就可以轻松应对,大的基本就上IOCP了。
IOCP在高并发服务端应用还是非常广泛的,它是一个纯异步IO模型即从上到下可以认为全是异步操作。这种操作等于隔离了IO操作和IO结果应用的实现。IO操作由系统实现,只有和上层应用通信即IO结果应用上才会发生状态和数据上的交换。其实就是将数据对IO的投递和接收队列化。由队列做为一种通信接口来实现应用线程与异步IO操作的交互,从而达到既隔离操作但又提供交互的机制。
需要说明一个问题,很多初学者甚至很多开发网络编程多年的开发者,都认为这些模型只用于服务端,其实不是的。不管是在什么平台,除非特别的约定或特定的情况下,都可以用在服务端和客户端。但一般情况下,由于这些模型相对来说要复杂不少,客户端的功能一般也比较弱小,所以大多还是使用普通的Socket编程来处理。

四、总结

在Windows平台上,网络高并发的开发,重点以游戏居多。其它的当然也可以做,毕竟IOCP可不是白给的。其实游戏行业是一个非常好的方向,开发者如果有兴趣的话可以深入的学习研究。当人们吃饱饭的时候儿,精神食粮就提到了必须的日程上来。至于游戏对青少年的影响,就看大环境了。
已经好多年不在Windows上进行编程了,以后的网络编程重要分析也是以类Linux平台为主。

相关文章:

c++应用网络编程之五Windows常用的网络IO模型

一、Windows的网络编程 其实对开发者而言,只有Windows和其它平台。做为一种普遍流行的图形OS,其一定会与类Linux的编程有着明显的区别,这点当然也会体现在网络编程上。Windows有着自己一套相对独立的上层Socket编程模型或者说框架&#xff0…...

PostgreSQL 中如何解决因大量并发删除和插入操作导致的索引抖动?

🍅关注博主🎗️ 带你畅游技术世界,不错过每一次成长机会!📚领书:PostgreSQL 入门到精通.pdf 文章目录 PostgreSQL 中如何解决因大量并发删除和插入操作导致的索引抖动一、理解索引抖动二、索引抖动的影响三…...

鑫创SSS1700USB音频桥芯片USB转IIS芯片

鑫创SSS1700支持IIC初始外部编(EEPROM选项),两线串行总线(I2C总线)用于外部MCU控制整个EEPROM空间可以通过MCU访问用于主机控制同步的USB HID外部串行EEPROM(24C02~24C16)接口,用于客户特定的USB视频、PID、…...

计算机视觉发展历程

文章目录 前言一、发展历程1)、萌芽期(1960s-1970s)2)、基础发展期(1980s)3)、系统开发期(1990s-2000s)4)、深度学习兴起期(2010s)5&a…...

从安装Node到TypeScript到VsCode的配置教程

从安装Node到TypeScript到VsCode的配置教程 1.下载Node安装包, 链接 2.双击安装包,选择安装路径,如下: 3.一直点击下一步,直至安装结束即可: 这个时候,node会默认配置好环境变量,并且…...

Jackson详解

文章目录 一、Jackson介绍二、基础序列化和反序列化1、快速入门2、序列化API3、反序列化API4、常用配置 三、常用注解1、JsonProperty2、JsonAlias3、JsonIgnore4、JsonIgnoreProperties5、JsonFormat6、JsonPropertyOrder 四、高级特性1、处理泛型1.1、反序列化List泛型1.2、反…...

【算法】字符串

快乐的流畅:个人主页 个人专栏:《算法神殿》《数据结构世界》《进击的C》 远方有一堆篝火,在为久候之人燃烧! 文章目录 引言一、最长公共前缀二、最长回文子串三、二进制求和四、字符串相乘 引言 字符串题,大多数是模…...

Python酷库之旅-第三方库Pandas(037)

目录 一、用法精讲 116、pandas.Series.div方法 116-1、语法 116-2、参数 116-3、功能 116-4、返回值 116-5、说明 116-6、用法 116-6-1、数据准备 116-6-2、代码示例 116-6-3、结果输出 117、pandas.Series.truediv方法 117-1、语法 117-2、参数 117-3、功能 …...

iOS 左滑返回事件的控制

0x00 视图结构 1-根视图 1.1-控制器A 1.1.1-控制器B 1.1.1.1-控制器C 0x01 控制 通过设置 self.navigationController.interactivePopGestureRecognizer.enabled 为 YES 或 NO 来控制当面界面,是否能左滑返回 在 控制器B 的生命周期方法内,设置属性 s…...

= null 和 is null;SQL中关于NULL处理的4个陷阱;三值逻辑

一、概述 1、NULL参与的所有的比较和算术运算符(>,,<,<>,<,>,,-,*,/) 结果为unknown&#xff1b; 2、unknown的逻辑运算(AND、OR、NOT&#xff09;遵循三值运算的真值表&#xff1b; 3、如果运算结果直接返回用户&#xff0c;使用NULL来标识unknown 4、如…...

拖拽上传(预览图片)

需求 点击上传图片&#xff0c;或直接拖拽图片到红色方框里面也可上传图片&#xff0c;上传后预览图片 效果 实现 <!DOCTYPE html> <html lang"zh-cn"><head><meta charset"UTF-8"><meta name"viewport" content&…...

Oracle 12c新特性 In-Memory Column Store

Oracle 12c引入了一项重要的特性——In-Memory Column Store&#xff08;简称IM或In-Memory&#xff09;&#xff0c;这一特性极大地提升了数据库在处理分析型查询时的性能。以下是关于Oracle 12c In-Memory特性的详细介绍&#xff1a; 一、基本概念 In-Memory Column Store&…...

【数据结构】二叉树———Lesson2

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f4a5;&#x1f4a5;个人主页&#xff1a;奋斗的小羊 &#x1f4a5;&#x1f4a5;所属专栏&#xff1a;C语言 &#x1f680;本系列文章为个人学习…...

mongodb数据导出与导入

一、先去检查mongodump mongodump --version 如果报 mongodump version: built-without-version-string 或者其他的较老的版本&#xff0c;直接去下载最新的【传送门】 【以Ubuntu18.04为例】 安装工具 假设你下载的是 .tgz 文件&#xff08;适用于 Linux 系统&#xff09;&am…...

电路学习——经典运放电路之滞回比较器(施密特触发器)(2024.07.18)

参考链接1: 电子设计教程29&#xff1a;滞回比较器&#xff08;施密特触发器&#xff09; 参考链接2: 滞回比较器电路详细分析 参考链接3: 比较器精髓&#xff1a;施密特触发器&#xff0c;正反馈的妙用 参考链接4: 比较器反馈电阻选多大&#xff1f;理解滞后效应&#xff0c;轻…...

NVIDIA Container Toolkit 安装与配置帮助文档(Ubuntu,Docker)

NVIDIA Container Toolkit 安装与配置帮助文档(Ubuntu,Docker) 本文档详细介绍了在 Ubuntu Server 22.04 上使用 Docker 安装和配置 NVIDIA Container Toolkit 的过程。 概述 NVIDIA 容器工具包使用户能够构建和运行 GPU 加速容器。即可以在容器中使用NVIDIA显卡。 架构图如…...

JavaWeb day01-HTML入门

Web前端 课程安排 HTML、CSS简介 HTML快速入门 实现标题排版 新闻标题样式...

驱动框架——CMSIS第一部分 RTE驱动框架介绍

一、介绍CMISIS 什么是CMSIS&#xff08;cortex microcontrol software interface standard一种软件标准接口&#xff09;&#xff0c;官网地址&#xff1a;https://arm-software.github.io/CMSIS_6/latest/General/index.html 包含的core、driver、RTOS、dsp、nn等部分&…...

Debezium日常分享系列之:Debezium2.7版本PostgreSQL数据库连接器

Debezium日常分享系列之:Debezium2.7版本PostgreSQL数据库连接器 一、概述二、连接器的工作原理安全快照初始快照的默认工作流程行为临时快照触发临时增量快照触发临时阻塞快照增量快照增量快照流程Debezium 如何解决具有相同主键的记录之间的冲突快照窗口触发增量快照具有附加…...

保障信息系统安全保护等级调整期间的安全性

保障信息系统安全保护等级调整期间的安全性&#xff1a; 策略与实践 在当今数字化时代&#xff0c;信息系统已成为企业和组织运营的核心支撑。为了适应不断变化的业务需求和安全威胁环境&#xff0c;信息系统安全保护等级的调整成为必要之举。然而&#xff0c;这一调整过程可能…...

泛微E9流程表单转PDF/HTML实战:手把手教你集成档案系统(附完整代码)

泛微E9流程表单转PDF/HTML全流程开发指南&#xff1a;从原理到实战 在企业管理数字化转型的浪潮中&#xff0c;OA系统与档案系统的无缝对接已成为提升组织效能的刚需。作为国内主流的协同办公平台&#xff0c;泛微E9的流程表单承载着企业核心业务流程数据&#xff0c;如何将这些…...

开源项目 Git 贡献全流程拆解:从入门到精通

好的&#xff0c;这是一篇关于开源项目 Git 贡献全流程拆解的技术文章大纲&#xff1a;开源项目 Git 贡献全流程拆解&#xff1a;从入门到精通引言开源精神与协作的重要性。Git 作为分布式版本控制系统在开源世界的核心地位。明确目标&#xff1a;清晰、完整地拆解向开源项目贡…...

Qwen3字幕系统Linux部署指南:从安装到性能调优

Qwen3字幕系统Linux部署指南&#xff1a;从安装到性能调优 为视频内容自动生成精准字幕的时代已经到来 还记得手动为视频添加字幕的痛苦经历吗&#xff1f;一遍遍听写、校对、调整时间轴&#xff0c;几分钟的视频往往需要花费数小时。现在&#xff0c;基于Qwen3的智能字幕系统可…...

w3x2lni技术指南:魔兽地图跨版本转换的实现与实践

w3x2lni技术指南&#xff1a;魔兽地图跨版本转换的实现与实践 【免费下载链接】w3x2lni 魔兽地图格式转换工具 项目地址: https://gitcode.com/gh_mirrors/w3/w3x2lni 技术原理&#xff1a;跨版本转换的底层架构 w3x2lni作为魔兽地图格式转换的专业工具&#xff0c;其核…...

translategemma-27b-it部署指南:Ollama模型缓存管理与多版本切换实践

translategemma-27b-it部署指南&#xff1a;Ollama模型缓存管理与多版本切换实践 你是不是也遇到过这样的烦恼&#xff1a;好不容易在Ollama上部署了一个大模型&#xff0c;用了一段时间想试试新版本&#xff0c;结果发现硬盘空间告急&#xff0c;或者不知道旧版本模型文件藏在…...

仿真模型中硅胶减震器的特征频率与谐振频率的受力分析

COMSOL仿真模型硅胶减震器减振器特征频率谐振频率受力分析仿真模型最近在研究硅胶减震器的特性&#xff0c;发现用COMSOL来仿真这东西还挺有意思的。硅胶减震器嘛&#xff0c;主要就是用来减振的&#xff0c;比如在一些精密仪器或者机械设备上&#xff0c;防止振动对设备造成损…...

告别网络依赖:用这个开源工具+高德离线包,5步搞定前端地图离线展示

前端开发者的离线地图解决方案&#xff1a;5步实现高德地图本地化部署 在紧急演示、内网开发或网络不稳定的环境中&#xff0c;依赖在线地图服务往往成为前端开发的痛点。我曾参与过一个政府内网项目&#xff0c;现场演示时因网络权限问题导致地图无法加载&#xff0c;最后不得…...

HP-Socket技术债务管理成熟度提升计划:行动项与时间表

HP-Socket技术债务管理成熟度提升计划&#xff1a;行动项与时间表 【免费下载链接】HP-Socket High Performance TCP/UDP/HTTP Communication Component 项目地址: https://gitcode.com/gh_mirrors/hp/HP-Socket HP-Socket作为高性能TCP/UDP/HTTP通信组件&#xff0c;随…...

OpenClaw性能优化:降低GLM-4.7-Flash任务Token消耗的5个技巧

OpenClaw性能优化&#xff1a;降低GLM-4.7-Flash任务Token消耗的5个技巧 1. 为什么需要关注Token消耗 当我第一次在本地部署OpenClaw并接入GLM-4.7-Flash模型时&#xff0c;最让我震惊的不是它的自动化能力&#xff0c;而是执行简单任务后查看账单时的Token消耗数字。一个看似…...

黑丝空姐-造相Z-Turbo实战项目:数据库课程设计之AI图库管理系统

黑丝空姐-造相Z-Turbo实战项目&#xff1a;数据库课程设计之AI图库管理系统 最近在带学生做数据库课程设计&#xff0c;发现一个挺有意思的现象&#xff1a;很多同学觉得数据库设计就是建几张表&#xff0c;写几个查询&#xff0c;做完就完了&#xff0c;跟实际应用脱节挺大的…...