学习IOCP中有几个不理解的地方观指点解释

学习IOCP中有几个不理解的地方望指点解释
本帖最后由 oyljerry 于 2013-12-20 09:51:09 编辑
最近在学习IOCP有几个不懂的地方望大家指点一下 谢谢!

1.服务器收到消息后,投递一次WSARecv,在GetQueuedCompletionStatus处会返回一个OP_READ,请问这时候的case OP_READ里应该处理什么样的逻辑呢?我的理解是WSARecv已经将消息发送给了客户端,那么就在
case OP_READ里判断缓冲区中是否还有需要发送的数据,如果有就再投递一次WSARecv,如此循环。
这样理解对么?

2.服务器发送消息,是否和收到消息一样,发送的时候投递一次WSASend,在GetQueuedCompletionStatus中返回一个OP_WRITE,然后在case OP_WRITE里判断缓冲区中是否还有数据需要发送,如果有就再投递一次WSASend,如此循环。

3.我的IOCP模型中的线程是这样的:
    a.创建CPU数目的工作线程,即处理GetQueuedCompletionStatus,比如这个就会有4个线程
    b.创建一个线程监听客户端连接,即处理accept
    C.创建一个线程发送数据,即处理WSASend
    d.创建一个线程接受数据,即处理WSARecv
这样服务器一共就创建了7个线程,其中4个工作线程是系统去调度,不需要我关心,其他三个线程由于会不断的处理各自不同逻辑,所以也不需要专门建立线程池去处理挂起之类的线程调度,这样理解对么?

暂时就这三个问题,望指点解释!谢谢!

------解决方案--------------------
本帖最后由 oyljerry 于 2013-12-20 09:51:17 编辑
C.创建一个线程发送数据,即处理WSASend
d.创建一个线程接受数据,即处理WSARecv

------------

这里不对。
你应该建立N个线程,每个都GetQueuedCompletionStatus,拿到一个完成包,即处理这个包,不分是send还是recv
------解决方案--------------------
1、2没问题,3楼上说的对。不需要b、c、d,直接在a的4个线程里处理accept、recv、send,如何处理就是你的1、2所说的。