



免费预览已结束,剩余1页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
如何取得IO返回的操作结果,并作处理在这一章中,我们的目标就集中在GetQueuedCompletionStatus。GetQueuedCompletionStatus 的作用就是从I/O出口队列中取得I/O操作结果。IOCP可以说是多入口(多种类型的函数可以提交I/O操作请求),单出口(一个函数就可以取得所有I/O操作的结果)。因此GetQueuedCompletionStatus 取得的结果将是复杂多样的。BOOL GetQueuedCompletionStatus( HANDLE CompletionPort, LPDWORD lpNumberOfBytes, PULONG_PTR lpCompletionKey, LPOVERLAPPED* lpOverlapped, DWORD dwMilliseconds);在GetQueuedCompletionStatus中要重点关注以下几点:(1) 返回的布尔值/ 操作成功与否的标志(2) lpCompletionKey 参数 / 标志那个socket的I/O操作结果(3) lpOverlapped 参数 / I/O操作得到的数据所在,看看I/O提交操作就知道了。接下来,看看一份测试数据,会明白很多 .各种情况下,返回值和其它参数的值得情况,如下表:Return valueCompletionPortlpNumberOfByteslpCompletionKeylpOverlappedWSAGetLastError()连接成功1 = TRUE1 = NOT NULL0(值为0 )1 = NOT NULL1(NOT NULL) 0连接超时01011121对方拒绝010111225对方关闭110110断线01011数据111 = NOT NULL110未知情况11010本地关闭0101164说明:1 ConnectEx 对方之后,如果成功连接,返回值为TRUE,lpNumberOfBytes 为零,lpOverlapped 不为 0,lpCompletionKey 为绑定值2 对方关闭之后,返回值为TRUE,lpNumberOfBytes 为零,lpOverlapped 不为 0。3 如果对方关闭后,socket没有关闭,而且还投递WSARecv请求,那么GetQueuedCompletionStatus会立刻返回,回到步骤24 ConnectEx 对方之后,如果对方拒绝连接,返回值为FALSE,lpOverlapped 不为 0,lpNumberOfBytes 为零。5 假如ConnectEx的对方不存在(超时),那么返回值为FALSE,lpOverlapped 不为0,lpCompletionKey 为绑定的值,lpNumberOfBytes 为0,6任何情况下lpCompletionKey的值都是原先绑定的值7CompletionPort肯定不能为NULL,否则得到的值全部为空。有了以上的表,是不是比MSDN上说的明白多了呢。下面看看代码如何实现:void CIOCP_ClientDlg:IocpWorkerThread()MYOVERLAPPED *lpOverlapped = NULL;DWORDdwByteRecv = 0;ULONG_PTR *PerHandleKey = NULL;while (1) lpOverlapped = NULL;if(m_hIocp = NULL)break;/如果I/O 出口队列有结果,GetQueuedCompletionStatus则取得结果返回,否则等待 BOOL bResult = GetQueuedCompletionStatus( m_hIocp,/ 从这个IOCP中取得I/O操作结果 &dwByteRecv,/ 发送或是接收了多少字节 (PULONG_PTR)&PerHandleKey, (LPWSAOVERLAPPED*)&lpOverlapped, INFINITE); if (bResult = FALSE) / 对照表1.1,可能是连接超时、对方拒绝连接、断线 SOCKET socket = (SOCKET)PerHandleKey) ; / 转换,得到当初关联的socketclosesocket(SOCKET)PerHandleKey); / 出问题了,关闭socketdelete lpOverlapped ; / 释放OVERLAPPED if (lpOverlapped = NULL) / 根据MSDN的说法,会出现这种情况 / 根据MSDN的说法,会出现这种情况,但测试时都没发生过 TRACE(TEXT(did not dequeue a pack from iocp queue.error:%dn), GetLastError(); continue; else / ERROR TRACE(TEXT( dequeued a pack from a failure iocp queue.error:%dn), GetLastError(); continue; / end if(lpOverlapped = NULL) else ASSERT(lpOverlapped != NULL); / SOCKET socket = (SOCKET)PerHandleKey; / 取得关联的socketswitch (lpOverlapped-operateType) / 操作类型判别case OP_CONNECT: / 连接操作,是成功的。TRACE0(connected successfully!n);lpOverlapped-operateType = OP_RECV; /再次利用原有的OVERLAPPEDDWORDFlags = 0;/ 连接上之后,就要提交接收请求了,否则将收不到对方发过来的数据if (WSARecv(socket, &lpOverlapped-wsabuf, 1,&lpOverlapped-dwByteRecvSend, &Flags,( LPWSAOVERLAPPED )lpOverlapped, NULL) = SOCKET_ERROR) if (WSAGetLastError() = WSA_IO_PENDING)TRACE0(Error = WSA_IO_PENDINGn);elseTRACE0(Error occured at WSARecv()n);break;case OP_ACCEPT:/ 得到一已连接的socketSOCKET socketAccept = (SOCKET)lpOverlapped-pVoid; /接下来就应该:/ (1)将socketAccept关联到IOCP ,代码略/ (2)提交接收请求,代码略break;case OP_SEND:/ASSERT(dwByteRecv = lpOverlapped-wsabuf.len);if(dwByteRecv != lpOverlapped-wsabuf.len)ASSERT(FALSE); / 没实际用途,只做测试/ ./TRACE0(send completely!n);delete lpOverlapped; / 发送操作成功了,释放OVERLAPPED 结构break;case OP_RECV:TRACE0(recv completely!n);if(0 = dwByteRecv ) / 由表1.1知道对方已经关闭TRACE0(Peer have been closed , me clsoe too.);closesocket(socket); / 关闭socketdelete lpOverlapped ;continue;/ 处理数据,数据在lpOverlapped-wsabuf-buf中/ / 接下来,继续提交接受请求,且再次利用原来的OVERLAPPED结构lpOverlapped-operateType = OP_RECV;DWORDFlags = 0;if (WSARecv(socket, &lpOverlapped-wsabuf, 1,&lpOverlapped-dwByteRecvSend, &Flags,( LPWSAOVERLAPPED )lpOverlapped, NULL) = SOCKET_ERROR) if (WSAGetLastError() = WSA_IO_PENDING)TRACE0(Error = WSA_IO_PENDINGn);elseT
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- DB61T 509.3-2011 秦岭猪苓蜜环菌菌种
- 高考计算考试题及答案
- 江西省宜春巿高安中学2025年高三数学第一学期期末教学质量检测模拟试题
- 山东省青岛市三十九中学2025年数学高三第一学期期末学业水平测试试题
- 重庆九龙坡区2025年数学高三第一学期期末调研试题
- 政治模拟试题及答案
- 2025年新安全生产法知识竞赛试题及答案
- 丰城市2025年从农村小学转岗教师到农村中学备考练习试题及答案解析
- 2025山东东营市景苑学校招聘劳务派遣教师20人备考练习题库及答案解析
- 2025宁波北仑区教育局公开招聘事业编制教师12人考试参考试题及答案解析
- 2025年全国企业员工全面质量管理知识竞赛题及参考答案
- 《非物质文化遗产概论(第三版)》全套教学课件
- 2025秋苏教版(2024)小学科学二年级上册(全册)课时练习及答案(附目录)
- 2025年中学生守则及中学生日常行为规范
- 巡察整改工作课件模板
- 2025年城镇燃气条例竞赛题库
- GB/T 22030-2025车用乙醇汽油调合组分油
- 展厅预算装修方案(3篇)
- 肺癌的护理新进展
- 2025年煤炭矿山职业技能鉴定考试-综采考试历年参考题库含答案解析(5套100道单选题合辑)
- 供电公司保密培训课件
评论
0/150
提交评论