注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

_

_

 
 
 

日志

 
 

IOCP编程注意事项  

2014-06-12 03:37:46|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

IOCP编程注意事项

分类: 网络通讯 2013-01-29 17:27 564人阅读 评论(0) 收藏 举报

1、每个连接同时最好只有一个待决的WSARecv。IOCP不保证多个待决WSARecv情况下先投递的WSARecv就一定会先得到完成通知。因此

,多个待决WSARecv可能导致数据乱序,无谓增加代码复杂性。
????? 2、投递0长度缓冲区的WSARecv可以不占用非分页内存,避免WSAENOBUFS错误。
????? 3、每个连接同时最好只有一个待决的WSASend。发送数据会锁定系统费非分页内存,过多的WSASend会导致WSAENOBUFS错误,麻烦的事

情。
????? 4、WSASend直接返回成功,说明数据已复制到发送缓冲区;若WSA_IO_PENDING,则当得到完成通知时,不会出现只发送部分数据的情

况(本人未具体研究,只是别人看了泄露的NT4.0的代码的得到的结论,为了万全,还是要考虑发送部分数据的情况,若出现发送部分数据情

况,那么一个连接投递多个WSASend就不行了,投递WSASend相当于追加发送缓冲区,滑动窗口未必会一次性更新)。
????? 5、IOCP是为响应大规模并发连接,做到了1、2、3和4能够尽可能的增加连接并发数量:因为并发数量很大程度是由非分页内存的占用

量决定的。
????? 6、服务端应该提供强制关闭和优雅关闭连接功能。推荐使用强制关闭,以避免socket的TIME_WAIT状态。?
????? 7、多多利用DisconnectEx函数实现socket 重用,因为socket的分配是有代价的。
????? 8、当socket资源被释放后,若不存在TIME_WAIT状态,要警惕系统立即把该socket值分配给新的连接,这就导致资源释放与新旧

socket资源同步问题。建议socket出错后,先释放相关资源,再closesocket或者DisconnectEx。
????? 9、DisconnectEx不能实现强制关闭:即使设置SO_LINGER选项,DisconnectEx也不会发出RST,只有FIN。
????? 10、当新建一个连接后,要对新的socket设置SO_UPDATE_ACCEPT_CONTEXT选项,否则对其的shutdown和DisconnectEx会有WSAENOTCONN错误,算是个bug。
????? 11、这个和强制关闭有关:取消已经投递的IO操作,可以使用的函数有CancelIO和CancelIOEx,具体区别参见MSDN。要注意,CancelIOEx需要Windows Server 2008及以上、Windows Vista及以上。

????? 12、考虑提供接收和发送紧急数据的接口。

????? 13、Overlapped(重叠)方式类似于zero-copy:直接锁定用户buffer至非分页内存。

????? 14、调用DisconnectEx()成功后,socket仍然和先前的绑定的完成建一一对应,除非使用closesocket()。

?????? 15、当然直接closesocket()也可以取消已投递的IO操作,但是要注意到资源同步的问题、可能发生的socket资源再分配问题。

?????? 16、GetQueuedCompletionStatusEx()是个好函数:一次调用尽可能多的获得完成通知,减少用户态和内核态之间的切换。

  评论这张
 
阅读(381)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017