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的主要内容,如果未能解决你的问题,请参考以下文章