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

wangsiyuanoo 2013-12-19 11:02:52
最近在学习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个工作线程是系统去调度,不需要我关心,其他三个线程由于会不断的处理各自不同逻辑,所以也不需要专门建立线程池去处理挂起之类的线程调度,这样理解对么?

暂时就这三个问题,望指点解释!谢谢!
...全文
125 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
KaleoVon 2013-12-24
  • 打赏
  • 举报
回复
1、2没问题,3楼上说的对。不需要b、c、d,直接在a的4个线程里处理accept、recv、send,如何处理就是你的1、2所说的。
5t4rk 2013-12-24
  • 打赏
  • 举报
回复
使用线程池CreateThreadPool
「已注销」 2013-12-20
  • 打赏
  • 举报
回复
C.创建一个线程发送数据,即处理WSASend
d.创建一个线程接受数据,即处理WSARecv

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

这里不对。
你应该建立N个线程,每个都GetQueuedCompletionStatus,拿到一个完成包,即处理这个包,不分是send还是recv

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧