IOCP学习笔记
来源:互联网 发布:淘宝卖家收入怎么查看 编辑:程序博客网 时间:2024/05/20 20:21
1.将一个SOCKET与一个完成端口关联
2.处理异步IO调用
3.同步线程
取得异步IO的结果,你得传递两个参数:CompletionKey,OVERLAPPED
CompletionKey--DWORD 你可以通过它传递唯一的值,一般情况下,它是一个指针,指向一个结构或类,包含一些客户端的一些信息
OVERLAPPED--结构 通常用来传递内存缓冲区以用于异步IO调用
调用PostQueuedCompletionStatus进行异步IO调用
调用GetQueuedCompletionStatus进行线程同步
4个IOCP常遇到的问题及解决方案
WSAENOBUFS错误,通常会以为是普通的死锁及内存泄漏
对服务器进行压力测试可能会出现这个错误
--解决方法:调用WSARead读取0字节缓冲区,当调用完成,我们知道有数据进入了TCP/IP栈
,然后通过调用几个异步WSARead(MAXIMUMPACKAGESIZE最大包字节)
这个方法锁定内存当数据到达时,解决了WSAENOBUFS这个错误,但是这个方法减少了服务器的数据吞吐量
包重排序问题
解决方案:添加序数到缓冲类中
在接收及发送中进行包排序
异步未决读取和大块字节处理问题
大部份的服务协议是以包为基础的协议,在包的开始X字节为头部,在头部包含了整个包的长度详情
大块字节流可能包含一个和几个通信包,也可能只包含包的一部份
存取异常
相对于IOCP的专属问题,这算是小问题了
当客户端连接丢失,并且IO调用反回一个错误标志,那么这个客户端已经死掉了
在CompletionKey,这是一个指针,包含了客户端的相关数据,如果我们释放它占用的内存,那么当其它的IO调用从相同的客户端
返回错误标志,当我们将CompletionKey转换为指针,尝试访问或者删除它时,这时将发生存取异常
解决方案:添中一个记数到结构中,这个记数包含了有多少未决的IO调用,然后当我们删除这个结构时,如果这个数为0,表明没有IO调用再需要它了
一些经验技巧
1不要在没有锁定的情况下就对ClientContext进行读取与写入
2避免或特别小心死锁
pContext-> m_ContextLock.Lock();
//… code code ..
pContext2-> m_ContextLock.Lock();
// code code..
pContext2-> m_ContextLock.Unlock();
// code code..
pContext-> m_ContextLock.Unlock();
上面这段代码可有造成死锁
3不要在通知函数之外存取ClientContext,除非你用临界区将其包起来
- IOCP学习笔记
- 我的IOCP学习笔记
- 学习笔记:神秘的 IOCP 完成端口
- 我的IOCP学习笔记 - 运行展示
- 学习笔记:神秘的 IOCP 完成端口
- 学习笔记:神秘的 IOCP 完成端口
- Windows2008新IOCP线程池学习笔记
- IOCP学习
- Delphi-IOCP学习笔记<一>====从零开始学习IOCP
- 【IOCP学习】IOCP模型总结
- Delphi-IOCP学习笔记<二>====IOCP基本函数介绍和理解
- WinSock学习笔记6:IOCP完成端口模型
- 我的IOCP学习笔记 - 相关类定义
- IOCP 笔记 (一)
- IOCP的一些笔记
- C/C++ IOCP 笔记
- 转载 [IOCP] 学习总结
- IOCP学习理解一
- 扩展方法join试演
- 用Visual C++编写电子邮件程序
- Windows live Messenger 9.0 下载地址
- Java XML存取二进制图片信息
- Socket发送信息
- IOCP学习笔记
- Linux 文件命令1
- trim()
- 快乐生活
- Linux 文件命令2
- 微软黑屏:不够智慧
- 一个数(3000内)等于两个素数之和
- Windows平台多线程编程
- 模块参数使用示例