谈谈IOCP发送数据时的一些误区及技巧
来源:互联网 发布:万方数据库医学网 编辑:程序博客网 时间:2024/05/01 14:57
2007-08-24 11:06:50| 分类: 默认分类|字号 订阅
邓立波 深圳,2007-8
作者联系方式:
email: libodeng@gmail.com
msn: libodeng@gmail.com
tel: 13510275799
版权/著作权所有 (C) 2007 邓立波 保留所有权利
警告:未经作者许可,任何人或组织不得转载,公开发布,拷贝,传播本文献的全部或部分
误区一,使用send函数发送数据
一些人使用阻塞的send函数发送数据,这是绝对应该避免的,一旦某一个连接传输发生拥塞,或者突然中断而没有通知,调用send函数的线程将可能被阻塞很长一段时间(可能10秒或更长),尤其是当服务器同时处理成千上万个连接时,这种情况可能会频繁出现。
使用非阻塞的send也不适合,数据不一定每次都能完全发送出去,你得使用select跟踪这些socket的发送状态(一旦可能,发送剩余数据),这失去了IOCP的优势。
误区二,在多个工作线程的情况下使用PostQueuedCompletionStatus
使用PostQueuedCompletionStatus向IOCP发送一个“写数据IO包”,然后由IOCP在工作线程里面调用WSASend发送数据,这在单个工作线程存在的情况下是安全的,这些“写数据IO包”将按它们被投递的顺序取出,并在工作线程中逐一处理。但在多个工作线程存在的情况下,数据仍然按它们投递的顺序取出,但处理不一定有序(即WSASend不一定按PostQueuedCompletionStatus投递的顺序被调用,iocp是个严格的fifo,线程切换却是随机的),而导致对方接收到的数据可能出现乱序。
比较好的一种方式是使用调用WSASend直接发送数据,注意对同一个连接连续调用多次WSASend是安全的,而不需要等到前一个WSASend的操作完成,数据将按调用WSASend的顺序发送。
在大多数情况下,上面的方式都可以满足要求,但对一个大容量和高并发的服务器,可能还需要对同一个连接限制并发的IO次数,以避免冲击可分页内存锁定极限和非分页内存极限,更好的方式是对每个连接仅允许一个pending send IO,这可以通过建一个发送缓存队列实现,当WSASend未返回操作完成时,后续提交的数据将放置于发送队列,直到WSASend完成,然后从发送队列取出一块数据,继续发送。
- 谈谈IOCP发送数据时的一些误区及技巧
- 谈谈IOCP发送数据时的一些误区及技巧
- 谈谈IOCP发送数据时的一些误区及技巧
- C# iocp通讯客户端只能发送数据,无法接收服务端发送的数据
- 谈谈敏捷开发的误区
- iocp 的一些分析
- IOCP的一些总结
- IOCP的一些心得
- IOCP的一些笔记
- 有关有scanf及printf的一些误区及问题
- .net发送邮件的一些技巧
- .net发送邮件的一些技巧
- .Net发送邮件的一些技巧
- Net发送邮件的一些技巧
- .net发送邮件的一些技巧
- .net发送邮件的一些技巧
- c++编程基础的一些基础知识及误区和方法
- 学习的一些误区
- Spring--quartz中cronExpression配置说明
- UVA 439
- 求去空格的sql语句
- ※设计模式※→☆创建型模式☆============Simple Factory模式(二)
- JRE is selected, but the path is invalid
- 谈谈IOCP发送数据时的一些误区及技巧
- PHP-redis中文文档
- minicom移植到ARM板
- 2012/12/13
- 服务器连接永远都应设计为“被动”关闭?
- java两个字符串的相似度
- JavaScript类和继承:constructor属性
- 编写大容量和健壮的服务器系列—处理IOCP资源释放
- 在linux下用tomcat部署java web项目的过程与注意事项