win32网络模型之重叠I/O
网上大部分重叠I/O的基本概念都讲得很清楚,但是大多讲得不是很深入,实际用起来很多问题。这里只对完成实例的通知进行讨论,对问题进行总结。
重叠IO异步读写后,在某一时刻"完成"后会进行"通知"。
什么是"完成":
例如,我们写入500字节,可能只有400字节写入成功,其余的100字节可能由于TCP/IP协议栈缓冲区已满,并没有写入成功,所以完成通知时,你需要进行检查,如果没有全部成功,应该对剩余的部分继续进行异步读写。
什么是"通知":
就是告诉你要对异步IO的结果进行处理,有事件和完成实例两种方式进行通知,事件通知限制比较大,不讨论。
在调用重叠IO接口时,会设置一个回调函数,当线程休眠时,会检查APC队列中有没有完成的IO,如果有则唤醒线程,调用回调函数进行处理。理想的情况下,处理流程看起来应该是这样的

重叠I/O的一般实现步骤是:
1、创建多个工作线程,并休眠,等待重叠IO完成进行唤醒,然后调用回调函数。
2、主线程中等待连接。
3、接受连接后,进行异步读取,然后再次等待连接。
由一个主线程等待客户端进行连接,连接成功后,交给工作线程,工作线程进行业务处理和异步读写操作,这是大部分网上实现代码的步骤。
最后的结果是,我们设置的读写完成回调函数,确实被调用了,但却是主线程调用的,工作线程没有一次被唤醒过。。。
后来,查询了不少资料,后来发现,工作线程被唤醒是有条件的,必须在工作线程调用重叠I/O接口,当工作线程休眠后,才能够被唤醒,调用回调函数。也就是说我们不能在主线程中调用异步读写函数,必须从线程池中去取一个工作线程,在这个工作线程里面调用,最后是通过QueueUserAPC函数实现的,具体实现Demo:OverlappedSocket.zip。
刚学习不久,如果有错误,请批评指正,谢谢^^。
win32网络模型之重叠I/O的更多相关文章
- windows网络模型之重叠IO(完成例程)的使用
#include <WINSOCK2.H> #include <stdio.h> #define PORT 5150 #define MSGSIZE 1024 #pragma ...
- windows网络模型之重叠IO的使用
大部分内容转载自https://blog.csdn.net/piggyxp/article/details/114883 目录: 1. 重叠模型的优点 2. 重叠模型的基本原理 3. 关于重叠模型的基 ...
- socket编程五种模型
客户端:创建套接字,连接服务器,然后不停的发送和接收数据. 比较容易想到的一种服务器模型就是采用一个主线程,负责监听客户端的连接请求,当接收到某个客户端的连接请求后,创建一个专门用于和该客户端通信的套 ...
- 2013 duilib入门简明教程 -- 结合win32和MFC (16)
虽然duilib自带在MFC中使用duilib的Demo,但只是MFC窗口和duilib窗口不重叠的情况.如果要在MFC窗口中嵌入duilib控件,或者在duilib控件中嵌入MFC的控件的话 ...
- 重叠I/O模型
一. 重叠I/O的概念当调用ReadFile和WriteFile时,如果最后一个参数lpOverlapped设置为NULL,那么线程就阻塞在这里,直到读写完指定的数据后,它们才返回.这样在读写大文件的 ...
- 重叠I/O之事件通知
在 Winsock 中,重叠 I/O(Overlapped I/O)模型能达到更佳的系统性能,高于select模型.异步选择和事件选择三种.重叠模型的基本设计原理便是让应用程序使 用一个重叠的数据 ...
- Win32<CreatFile>
CreateFile函数详解 CreateFile The CreateFile function creates or opens the following objects and returns ...
- Win32/MFC的基本概念
一.MFC的基本概念 单文档.多文档和对话框框架的区别 MFC中的类继承图的基本框架 CView类与CDocument的关系 Onpaint()和Ondraw()的关系 hdc-cdc区别联系 RUN ...
- 关于Winsock编程中IO重叠的概念
我在看<Windows网络与通信程序设计>(王艳平)这本书时,对重叠IO很不理解,突然就冒出这么一个概念,没一点头绪.就目前的理解做一个整理. 第一种理解:OVERLAPPED,顾名思义为 ...
随机推荐
- [转载]C++之路起航——标准模板库(deque)
转自:https://www.cnblogs.com/grhyxzc/p/5074061.html deque(双端队列):http://baike.baidu.com/link?url=JTvA2c ...
- 数组中的stdClass Object如何访问
使用print_r($data)输出结果为 Array ( [0] => stdClass Object ( [color_item_no] => 1 [color_name] => ...
- 【科普】GSM伪基站 劫持 诈骗?用4G网就安全?想强制用4G?最详细的科普教程在此!
最近在一些主流论坛(豆瓣.贴吧.虎扑.天涯)都出现了讨论GSM诈骗的新闻,很多受害者受骗. 1.什么是GSM劫持? 平时你的手机是连接到了运营商的基站,才能收到电话短信.伪基站就是有人也买了运营商的基 ...
- VirtualBox运行出现“0x00000000指令引用的0x00000000内存。该内存不能为written” ,错误解决
win7 64位系统,运行virtual box 出现如下错误 错误原因:由于系统主题被破解导致的 解决办法: 1.管理员身份运行UniversalThemePatcher_1.5.22 x64,点击 ...
- buntu下cutecom图像界面串口调试工具使用
一.安装,首先下载这个软件,终端和软件中心均可下载,终端下载命令: sudo apt-get install cutecom 即可快速搞定安装问题. 软件中心: 由于我已经通过终端安装成功,所以软件中 ...
- swagger2的接口文档
以前见过一个swagger2的接口文档,特别好用,好看,对接口中入参描述的很详细:适合用于项目的开发 后来自己做项目的时候,没有找到这个swagger版本 <dependency> < ...
- vue-update-表单形式复写方法上传图片
handleSave() { const formData = new FormData(); /* eslint-disable */ for (let key in this.dataInfo) ...
- vue的技巧代码
转载:https://segmentfault.com/a/1190000014085613 第一招:化繁为简的Watchers 场景还原: created(){ this.fetchPostList ...
- 加快Gradle的构建过程
Gradle配置文件中加入守护进程 org.gradle.daemon=true 这个守护进程是在第一次编译时才开启进程进行编译,之后的编译将不再开启进程重新编译,这样以减小编译的速度
- 【转】在.net Core 中像以前那样的使用HttpContext.Current
1.首先我们要创建一个静态类 public static class MyHttpContext { public static IServiceProvider ServiceProvider; p ...