网络程序设计——重叠I/O模型

news2025/1/20 7:12:20

目录

1、重叠I/O

(1)概念

(2)重叠数据结构WSAOVERLAPPED  

2、重叠I/O的相关函数

(1)套接字创建

(2)发送数据函数

(3)两种获取传输数据数量的方法

3、 重叠I/O模型的编程框架

(1)使用事件通知方式进行重叠I/O的编程框架

 (2)使用完成例程方式进行重叠I/O的编程框架

(3)以面向连接额的数据接收为例

4、重叠I/O模型评价

1、重叠I/O

(1)概念

  •        重叠I/O模型是以Windows重叠I/O机制为基础的套接字I/O模型。Windows重叠I/O本来是一种文件操作技术。在传统文件操作中,文件的读写函数都是以阻塞模式工作的,当文件很大或磁盘读写速度较低时,程序运行就会长时间阻塞在文件的读写操作上,直到读写完成才返回。这样将浪费很多时间,导致程序性能下降。为了解决这个问题,Windows引进了重叠I/O的概念。能同时以多个线程处理多个I/O。
  •       在重叠I/O下,应用程序在调用文件读写函数后函数会立即返回,而不必等待操作结束,文件读写的同时应用程序可以执行其他操作,这就是所谓的异步I/O操作。如果让应用程序连续进行多个文件读写函数的调用,使得系统同时执行多个文件的读写操作,就成为所谓的重叠I/O操作
  •         WinSock的重叠I/O模型就是以重叠I/O机制为基础开发的。从WinSock2开始,重叠I/O模型便被引入到WinSock的扩展套接字函数中,这些扩展函数的格式不再与BSD套接字函数兼容,函数名均以WSA开头,比如recv()函数和send()函数的Windows扩展版分别为WSARecv()和WSASend()。应用程序要使用重叠I/O模型,就必须使用WinSock扩展套接字函数。

(2)重叠数据结构WSAOVERLAPPED  

typedef struct _WSAOVERLAPPED{
ULONG_PTR Interal; //底层操作系统使用
ULONG_PTR InteralHigh; //底层操作系统使用
union{
    struct{
       DWORD offset; //套接字是忽略,文件操作使用。
       DWORD offsetHigh; //忽略
    };
PVOID Pointer; //忽略
};
HANDLE hEvent;//允许应用程序为这个操作关联一个事件对象句柄
}WSAOVERLAPPED, *LPWSAOVERLAPPED;
  •        重叠I/O的事件通知方法需要Windows事件对象关联到WSAOVERLAPPED结构。当I/O完成时,会将WSAOVERLAPPED结构中的hEvents置为有信号状态。
  •       通过调用WSAWaitForMultipleEvents()来等待I/O完成的通知,在得到通知信号后,就可以调用WSAGetOverlappedResult()来查询I/O操作的结果,并进行相关处理。WSAOVERLAPPED结构在重叠I/O请求初始化及其后续的完成之间提供一个沟通或通信机制。

2、重叠I/O的相关函数

(1)套接字创建

SOCKET WSASocket{

int af, int type, int protocol,
LPWSAPROTOCOL_INFO lpProtocolInfo,//指定新套接字的特性
GROUP g, //保留
DWORD dwFlags//在重叠I/O模型中,需要设置为WSA_FLAG_OVERLAPPED。
};

(2)发送数据函数

int WSASend{

SOCKET s,
LPWSABUF lpBuffers,//指向WSABUF结构数组的指针
DWORD dwBufferCount,//记录lpBuffers数组中WSABUF结构的数目
LPDWORD lpNumberOfBytesSent, //返回指向发送的字节数的指针
DWORD dwFlags, //标志
LPWSAOVERLAPPED lpOverlapped, //指向重叠结构的指针
LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
//指向发送操作完成后调用的完成例程

};

       如果重叠操作立即完成,则返回0;如果重叠操作被成功初始化,并且稍后完成,则返回WSA_IO_PENDING。

(3)两种获取传输数据数量的方法

  • 1)如果指定了完成例程,通过cbTransferred参数获取
  • 2)通过WSAGetOverlappedResult()的参数lpcbTransferred获取。

3、 重叠I/O模型的编程框架

WinSock可以使用事件通知和完成例程两种方式来实现重叠I/O的操作。

(1)使用事件通知方式进行重叠I/O的编程框架

  • 套接字初始化,设置为重叠I/O模式;
  • 创建套接字网络事件对应的用户事件对象;
  • 初始化重叠结构,为套接字管理事件对象;
  • 异步接收数据,无论能否接收到数据,都会直接返回;
  • 调用WSAWaitForMultipleEvents(),在所有事件对象上等待,只要有一个事件对象变为授信状态,则返回;
  • 调用WSAGetOverlappedResult(),获取套接字上的重叠操作状态,并保存到重叠结构中;
  • 根据重置事件的状态进行处理;
  • 重置已授信的事件对象、重叠结构、标志位和缓冲区;
  • 回到步骤4。

 (2)使用完成例程方式进行重叠I/O的编程框架

      对于网络重叠I/O操作,等待I/O操作结束的另一种方法是使用完成例程。异步的发送和接收接口函数的参数中的最后一个参数lpCompletionROUTINE就是用来指向完成例程的指针。若指定此参数,hEvent参数将被忽略,上下文信息将传送给完成例程函数。

①完成例程函数原型

void CALLBACK CompletionROUTINE{
DWORD dwError, //指定lpOverlapped参数中表示的重叠操作的完成状态
DWORD cbTransferred, //传送完成的数据数量
LPWSAOVERLAPPED lpOverlapped, //指定重叠结构
DWORD dwFlags  //指定操作结束时的标记,通常设置为0
};

(3)以面向连接额的数据接收为例

  • 套接字初始化,设置为重叠I/O模式;
  • 初始化重叠结构;
  • 异步传输数据,将重叠结构作为输入参数,并指定一个完成例程对应于数据传输后的处理;
  • 调用WSAWaitForMultipleEvents()或SleepEx(),将自己的线程设置为一种可警告等待状态,等待一个重叠I/O请求完成,重叠请求完成后,完成例程会自动执行,在完成例程内,可随一个完成例程一起投递另一个重叠I/O操作;
  • 回到步骤3。

4、重叠I/O模型评价

  • 应用程序中的I/O操作<-->重叠结构<-->事件
  • 使应用程序能达到更佳的系统性能
  • 减少了一次从I/O缓冲区到应用程序缓冲区的拷贝。

如有错误,敬请指正。

您的收藏与点赞都是对我最大的鼓励和支持!

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

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

相关文章

17.指针的概念及其分类

内存 存储器 存储数据的器件 外部存储器 长期存放数据&#xff0c;掉电不丢失数据。 常见的外存数据&#xff1a;硬盘、ROM、U盘 内部存储器 暂时存储数据&#xff0c;掉电丢失 常见的内存数据&#xff1a;ram、DDR 物理内存 实实在在的存储设备。 虚拟内存 操作系统虚拟…

FFmpeg进阶: 截取视频生成gif动图

文章目录1.封装视频滤镜2.截取视频生成gif3.gif优化4.示例效果现在互联网上很多人都通过表情包来表达自己的情绪&#xff0c;常用的表情包很多都是视频文件的一部分。这里就介绍一下如何通过ffmpeg截取视频生成gif动图。其实原理很简单&#xff0c;首先我们seek到视频对应的位置…

Go sync.WaitGroup的学习

一.前言 二. 夯实基础 2.1 sync.WaitGroup是什么&#xff1f; Go语言中除了可以使用通道&#xff08;channel&#xff09;和互斥锁进行两个并发程序间的同步外&#xff0c;还可以使用等待组进行多个任务的同步&#xff0c;等待组可以保证在并发环境中完成指定数量的任务 在…

Spring Boot 中的Thymeleaf分页和排序示例

在上一篇文章中&#xff0c;我们已经知道如何构建Spring Boot Thymeleaf示例。今天&#xff0c;我将继续使用 Spring Data 和 Bootstrap 进行 Thymeleaf 分页和排序&#xff08;按列标题&#xff09;。 百里香叶分页和排序示例 假设我们在数据库中有这样的教程表&#xff1a;…

深入理解 Android 模块化里的资源冲突

翻译自 Understanding resource conflicts in Android ⚽ 前言 作为 Android 开发者&#xff0c;我们常常需要去管理非常多不同的资源文件&#xff0c;编译时这些资源文件会被统一地收集和整合到同一个包下面。根据官方的《Configure your build》文档介绍的构建过程可以总结这…

RFSoC应用笔记 - RF数据转换器 -22- API使用指南之配置DAC相关工作状态和中断相关函数使用

前言 本文完结后&#xff0c;关于RFSoC的配置的API函数部分就全部介绍完毕&#xff0c;后续有空将更新介绍简单的射频收发回环示例工程&#xff0c;不定时更新&#xff0c;敬请期待。 配置DAC相关工作状态 XRFdc_SetInterpolationFactor 函数原型 u32 XRFdc_SetInterpolat…

内存一致性,指令重排序,内存屏障,volatile解析

文章目录为什么会存在“内存可见性”问题重排序与内存可见性的关系as-if-serial语义单线程程序的重排序规则多线程程序的重排序规则happen-before是什么解决方案&#xff1a;内存屏障Volatile关键字解决内存可见性问题的实现原理为什么会存在“内存可见性”问题 下图为x86架构…

redis 的企业实战应用 (二)

前言&#xff1a; 如今redis的常用场景有 短信登录&#xff1a;使用redis共享session来实现 商户查询缓存&#xff1a;会理解缓存击穿&#xff0c;缓存穿透&#xff0c;缓存雪崩等问题&#xff0c;让小伙伴的对于这些概念的理解不仅仅是停留在概念上&#xff0c;更是能在代码…

【数学】仿射变换

∣降维打击NightguardSeries.∣\begin{vmatrix}\Huge{\textsf{ 降 维 打 击 }}\\\texttt{ Nightguard Series. }\end{vmatrix}∣∣∣∣∣​ 降 维 打 击 Nightguard Series. ​∣∣∣∣∣​ 注&#xff1a;本文讨论的仿射变换仅为y轴上的伸缩变换&#xff0c;且难度在高中生理…

H3CNE V7.0 视频教程

构建中小企业网络全套PPT汇总【V7版本】 第1章 计算机网络概述 第2章 OSI参考模型与TCP IP模型 第3章 局域网基本原理 第4章 广域网基本原理 第5章 IP基本原理 第6章 TCP和UDP基本原理 第7章 路由器、交换机及其操作系统介绍 第8章 命令行操作基础 第9章 网络设备文件…

mycat-3-实战篇

1 总结&#xff1a; 1&#xff1a;用的表必须在mycat的配置文件中配置。 2&#xff1a;mycat默认分片策略中&#xff0c;都是针对表的主键&#xff0c;默认是id,如果主键不是id的&#xff0c;请去rule.xml自己复制一份修改 3&#xff1a; 2 注意细讲解 1&#xff1a;schem…

Springboot启动流程分析(四):完成启动流程

目录 一 添加BeanPostProcessors到IOC容器 二 国际化支持 三 初始化监听器的多路播放器 四 刷新容器 五 注册监听器到IOC容器的多播器 六 完成bean的大规模实例化 6.1 大规模实例化bean 6.1.1 连续三层do...while循环作用 6.1.2 FactoryBean是什么&#xff1f;为什么要…

04 YAML kubetnetes世界里的通用语

文章目录1. 前言2. 声明式和命令式是怎么回事&#xff1f;3. 什么是YAML&#xff1f;4. 什么是API对象&#xff1f;4.1 k8s都有哪些资源对象4.2 列出kubectl 命令详细执行过程5. 如何描述 API 对象5.1 命令式5.2 声明式5.2.1 声明式YAML语法详解5.2.1.1 header部分详解5.2.1.2 …

【教学类-19-01】20221127《ABAB式-规律排序-A4竖版2份》(中班)

展示效果&#xff1a; 单人使用样式&#xff1a; 单页打印样式 ​ 背景需求&#xff1a; 中班幼儿需要掌握ABAB规律排序&#xff0c;如下图所示&#xff0c;AB两个元素能外形不同、颜色不同。 ​ ​利用Python Word单元格填色功能&#xff0c;随机生成AB样式&#xff0c;引…

STM32模拟IIC与IIC四种实现数字光强采集模块GY30(标准库与HAL库)

目录 代码实现是的IIC通信&#xff0c;数据采集后在串口显示&#xff0c;方便大家实现二次开发 原件选择 GY-30 数字光强度介绍 BH1750芯片参数 引脚说明 BH1750指令集 接线表设计 通过四种方式实现GY-30数据采集 1.标准库模拟IIC实现GY-30采集并串口1显示 2.标准库IIC…

重构uniapp uni-ui coloerUI项目

重构uniapp uni-ui coloerUI项目这里写自定义目录标题重构uniappuni-uicoloerUI项目起源流程重构uniappuni-uicoloerUI项目 起源 从网上复制了若依移动端的代码,但是对里面的文件夹布局方式和第三方组件库引入方式不甚了解,就想着从头创建一个空白项目&#xff0c;然后一步一…

Linux中设置开机启动执行命令和普通用户配置环境变量开机启动生效

记录&#xff1a;343 场景&#xff1a;在CentOS 7.9操作系统上&#xff0c;开机启动就执行自定义的命令&#xff0c;配置rc.local文件达到需求&#xff1b;在普通用户中配置环境变量开机启动生效&#xff0c;使用profile实现。 版本&#xff1a; 操作系统&#xff1a;CentOS…

01、Docker入门

目录 1、Docker是什么 2、Docker与虚拟化 3、Docker虚拟化的好处 好处一&#xff1a;应用部署方便 好处二&#xff1a;服务器同等配置&#xff0c;性能更优&#xff0c;利用率更高 4、核心概念 5、CentOS7 安装docker(在线方式) 6、镜像 7、Docker容器 8、查看Docker容…

typescript 八叉树的简单实现

查了一些文章&#xff0c;准备自己用typescript写一个简单的八叉树场景管理。 所谓的简单&#xff0c;就是所有元素都是边长为1的立方体。 元素类和树节点类 //元素类&#xff0c;因为都是边长为1的立方体&#xff0c;所以就用cube命名 export class CubeData {public reado…

由于没有远程桌面授权服务器可以提供许可证,远程会话连接已断开

一、问题描述 在使用Windows的远程桌面工具连接WindowsServer2016服务器时&#xff0c;无法连接到服务器&#xff0c;并且提示【由于没有远程桌面授权服务器可以提供许可证&#xff0c;远程回来连接已经断开。请跟服务器管理员联系】。 二、解决办法 2.0、前提 Windows Serv…