• 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

      刚学习不久,如果有错误,请批评指正,谢谢^^。

        

            

  • 相关阅读:
    .ssh/config 常用配置
    openresty(nginx) 配置 http与https使用同一个端口,禁止 IP 直接访问
    uni-app 入门小白纯徒手编写组件 hello-popup
    CSS 是啥?前端小白入门级理解
    爱思助手备份 iPhone 时没有设置密码,恢复备份时需要密码的问题
    introduction-to-64-bit-assembly
    flv to mp4
    Hopper Disassembler系列之Sublime Text 3 爆破
    Hopper 学习
    微信小游戏 Three.js UI 2D text 简单方案
  • 原文地址:https://www.cnblogs.com/dongc/p/6508661.html
Copyright © 2020-2023  润新知