win32网络模型之重叠I/O

Posted DC

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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的主要内容,如果未能解决你的问题,请参考以下文章

网络I/O模型---同步异步阻塞非阻塞之惑

四.Windows I/O模型之重叠IO(overlapped)模型

网络编程之五种I/O模型

Overlapped Model

WEB服务-Nginx之1-网络IO模型和常用事件驱动模型

简明网络I/O模型---同步异步阻塞非阻塞之惑