网上大部分重叠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的更多相关文章

  1. windows网络模型之重叠IO(完成例程)的使用

    #include <WINSOCK2.H> #include <stdio.h> #define PORT 5150 #define MSGSIZE 1024 #pragma ...

  2. windows网络模型之重叠IO的使用

    大部分内容转载自https://blog.csdn.net/piggyxp/article/details/114883 目录: 1. 重叠模型的优点 2. 重叠模型的基本原理 3. 关于重叠模型的基 ...

  3. socket编程五种模型

    客户端:创建套接字,连接服务器,然后不停的发送和接收数据. 比较容易想到的一种服务器模型就是采用一个主线程,负责监听客户端的连接请求,当接收到某个客户端的连接请求后,创建一个专门用于和该客户端通信的套 ...

  4. 2013 duilib入门简明教程 -- 结合win32和MFC (16)

        虽然duilib自带在MFC中使用duilib的Demo,但只是MFC窗口和duilib窗口不重叠的情况.如果要在MFC窗口中嵌入duilib控件,或者在duilib控件中嵌入MFC的控件的话 ...

  5. 重叠I/O模型

    一. 重叠I/O的概念当调用ReadFile和WriteFile时,如果最后一个参数lpOverlapped设置为NULL,那么线程就阻塞在这里,直到读写完指定的数据后,它们才返回.这样在读写大文件的 ...

  6. 重叠I/O之事件通知

      在 Winsock 中,重叠 I/O(Overlapped I/O)模型能达到更佳的系统性能,高于select模型.异步选择和事件选择三种.重叠模型的基本设计原理便是让应用程序使 用一个重叠的数据 ...

  7. Win32<CreatFile>

    CreateFile函数详解 CreateFile The CreateFile function creates or opens the following objects and returns ...

  8. Win32/MFC的基本概念

    一.MFC的基本概念 单文档.多文档和对话框框架的区别 MFC中的类继承图的基本框架 CView类与CDocument的关系 Onpaint()和Ondraw()的关系 hdc-cdc区别联系 RUN ...

  9. 关于Winsock编程中IO重叠的概念

    我在看<Windows网络与通信程序设计>(王艳平)这本书时,对重叠IO很不理解,突然就冒出这么一个概念,没一点头绪.就目前的理解做一个整理. 第一种理解:OVERLAPPED,顾名思义为 ...

随机推荐

  1. Docker应用

    1.tomcat容器创建 docker run -d --name Jdd_tomcat  -p 8081:8080 tomcat [root@localhost etc]# docker run - ...

  2. jquery之div模拟textarea文本域轻松实现高度自适应

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  3. WIN8外包公司—长年承接WIN8(surface)应用外包—北京动点飞扬软件

    WIN8外包公司—长年承接WIN8(surface)应用外包 一.我们长年专门承接WIN8外包.Surface外包. WPF 外包.HTML5外包.WindowsPhone 外包.Silverligh ...

  4. mybatis分页插件PagePlugin

    查询的参数对象里面继承PageInfoWrapper类(也可以不继承这个类,但要保证查询参数对象里面必须要有一个PageInfo属性) 分页信息都在PageInfo这个类里,查询的时候,分页参数,填充 ...

  5. 实现Python与STM32通信

    断断续续学了几周Stm32后,突然想实现上位机和下位机的通信,恰好自己学过一点python,便想通过python实现通信. 在网上看见python库pyserial可以实现此功能,便去官网找了一下 , ...

  6. 【转】关于高可用负载均衡的探索-基于Rancher和Traefic

    原文链接:http://www.dwz.cn/7F4r2T 原创 2018-03-23 张新峰 RancherLabs 本文于3月22日晚由张新峰,杭州爱医康架构师技术分享整理而成.本次分享介绍了如何 ...

  7. Vmware ESXi 的虚拟机的开机自启动

    ESXi 6.7 以前就注意到虚拟机有个菜单[action->autostart]可以用来自启动(物理机开机之后), 可是设置完之后,总是没成功. 今天重新google了,发觉不但虚拟机,整个物 ...

  8. ES6 4个方法

    var string = 'Yo' string.startsWith('Y')        -> true      startsWith()查找字符串是否是以某一个字段开始的 string ...

  9. linux中执行shell命令的几种常用方法

    1 切换到shell脚本所在目录执行shell脚本: cd /test/shell ./test.sh 2 以绝对路径的方式执行shell脚本: /test/shell/test.sh 3 直接使用b ...

  10. append、appendTo、prepend、prependTo、before、insertBefore、after、insertAfter、replaceAll方法被调用后,原本在页面上显示的元素会消失

    详细描述: $ele.append..appendTo..prepend..prependTo..before..insertBefore..after..insertAfter..replaceAl ...