IOCP多次投递

iocp 的话 可以同时进行多次投递 这是没有问题的。 你可以同时投递读和写。 写的话  可以同时投递多个,而且 他会按照你投递的顺序进行发


理论上说iocp 如果同时多次投递send 如果某次没有send 完整的话 那就会出现乱序的。但是我在自己的代码里没遇到过,所以你自己考虑一
下。 你可以可以在自己的socket 对象上面加一个发送队列,只进行一次send 投递,在发送成功以后,从队列里面继续取消息来发送。这样应该是
很好的设计,但是效率上却未必好。

IOCP是不会保证投递序列按投递顺序返回完成包的。《windows网络编程》说的很清楚。如果你先投递1个10K的操作,再投递一个20K的操作,你Get-IoCompletion的时候可能先获取20K那个操作的完成包。

 

1.问:是不是当返回“读”完成的时候,就处理所读取的数据,最后再投递一个“读操作”;
      答:当"读"完成的时候,可以再投递一个"读操作",然后处理所读取的数据,或者开工作线程处理读取的数据;
2.问:当返回“写”完成的时候,就直接将该操作绑定的PER_IO_DATA回收到内存池?
 答:当返回"写"完成的时候,要检查"写"的结果,存在只"写"成功部分数据的情况,还要继续"写";


逻辑线程(尤其是比较耗时的处理过程)应该与IO线程分开,也就是投递一个读操作并返回“读”完成后马上再投递一个读操作,获取的数据应该在另外一个线程处理,而不应该
直接处理,阻塞住IO线程。


无论rev/send,每个连接都应该有自己的缓冲队列,r的用于处理粘包半包,s的用于流量缓冲控制。
此外,在我自己的应用中,网络模块(独立进程)收到完整数据(能成功解析出逻辑包),再使用namedpipe(也用IOCP)转发给具体工作进程,反向流程依-然。

 

http://groups.google.com/group/dev4server/browse_frm/thread/3699835afdacc35f/764ac820225aadaa?lnk=gst&q=wsasend#764ac820225aadaa
http://groups.google.com/group/dev4server/browse_frm/thread/44c9122f7b8dfead/2537467a318af889?lnk=gst&q=wsasend#2537467a318af889
http://topic.csdn.net/t/20050119/12/3737501.html
http://topic.csdn.net/t/20050516/22/4011884.html
http://libo.deng.blog.163.com/blog/static/40157422200772411650957/:
比较好的一种方式是使用调用WSASend直接发送数据,注意对同一个连接连续调用多次WSASend是安全的,而不需要等到前一个WSASend的操作完成,数据将按调用WSASend的顺序发送。
对一个大容量和高并发的服务器,可能还需要对同一个连接限制并发的IO次数,以避免冲击可分页内存锁定极限和非分页内存极限,更好的方式是对每个连接仅允许一个pending send IO,这可以通过建一个发送缓存队列实现,当WSASend未返回操作完成时,后续提交的数据将放置于发送队列,直到WSASend完成,然后从发送队列取出一块数据,继续发送。


http://libo.deng.blog.163.com/blog/static/40157422200772132422119/
http://blog.csdn.net/sodme/archive/2006/04/17/666062.aspx
http://libo.deng.blog.163.com/blog/static/4015742220077112452622/: 处理IOCP连接关闭:安全的关闭连接, 避免TIME_WAIT状态, socket唯一性问题

http://book.21www.cn/info/vc_mfc/net/909.html: 你用wsasend()提交了1024个字节的数据时,wsasend()并不能保证在GetQueuedCompletionStatus()处理到完成消息时,就发出了1024个字节,可能小于1024,因为GetQueuedCompletionStatus()返回了这次完成的字节数(dwIoSize),当返回的数字小于1024时,你需要后移发送缓冲区的指针,用wsasend()完成剩余数据的发送。

http://topic.csdn.net/t/20051008/23/4313282.html: msdn中提到的The   successful   completion   of   a   WSASend   does   not   indicate   that   the   data   was   successfully   delivered.表示如,当你用wsasend()提交了1024个字节的数据时,wsasend()并不能保证在GetQueuedCompletionStatus()处理到完成消息时,就发出了1024个字节,可能小于1024,因为GetQueuedCompletionStatus()返回了这次完成的字节数,当返回的数字小于1024时,你需要后移发送缓冲区的指针,用wsasend()完成剩余数据的发送。所以在第一段中的completed指的是发送完了你要求发送的字节数。然后在销毁!
 send,WSASend只保证把用户缓冲区里面的数据拷贝到系统缓冲区,不是把数据发送到对方  
  一次能拷贝多少,依据你的机器情况。  
  所以在Send,WSASend之后,要获得返回值,判断一下,有多少用户缓冲区的字节成功的拷贝到了系统缓冲区,以便把没有拷贝的自己,在下次指定拷贝进去
 
 
http://www.cnitblog.com/linghuye/archive/2007/11/28/36997.html: ICOP的一些结论 -- 仅是我的实践结论

http://hi.baidu.com/lateblue/blog/item/97161bde1186ef1a48540364.html: IOCP模型总结(转)
http://www.cnblogs.com/duzouzhe/archive/2009/10/30/1592673.html: IOCP使用时常见的几个错误 (转)
http://hi.baidu.com/guangbinw/blog/item/670368772713ac12b051b9fd.html: GetQueuedCompletionStatus的返回值
http://www.cppblog.com/twzheng/archive/2007/04/16/21991.html: GetQueuedCompletionStatus函数  

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值