IOCP的使用

来源:互联网 发布:lol刷点卷软件2016 编辑:程序博客网 时间:2024/05/16 11:11

 

flag=GetQueuedCompletionStatus( 
  HANDLE CompletionPort,      
  LPDWORD lpNumberOfBytes,   
  PULONG_PTR lpCompletionKey, 
  LPOVERLAPPED *lpOverlapped, 
  DWORD dwMilliseconds
);

 

针对:如果 *lpOverlapped为空并且函数没有从完成端口取出完成包,返回值则为0。函数则不会在lpNumberOfBytes and lpCompletionKey所指向的参数中存储信息。

if(lpOverlapped== NULL)  {continue;}  


针对: 如果 *lpOverlapped不为空并且函数从完成端口出列一个失败I/O操作的完成包,返回值为0。函数在指向lpNumberOfBytesTransferred, lpCompletionKey, and lpOverlapped的参数指针中存储相关信息。调用GetLastError可以得到扩展错误信息
if(FALSE == flag && GetLastError()!=0){ 归还IO句柄;continue;}


针对:如果关联到一个完成端口的一个socket句柄被关闭了,则GetQueuedCompletionStatus返回ERROR_SUCCESS,并且lpNumberOfBytes等于0 .

ERROR_SUCCESS这个值是0,即返回值是0(false)且GetLastError()等于0,与上面的错误处理代码是有分别的。
if(opType != IO_ACCEPT && dwByteTrans == 0) {做断开处理,归还IO;continue;}


针对: 如果函数从完成端口取出一个成功I/O操作的完成包,返回值为非0。函数在指向lpNumberOfBytesTransferred, lpCompletionKey, and lpOverlapped的参数中存储相关信息。
switch(){根据IO类型做相关操作}

}


现在的问题是:我需要在(FALSE == flag && GetLastError()!=0)的情况下做一些处理。导致GetQueuedCompletionStatus返回失败的因素有很多,最常见的是〖1236〗-由本地系统终止网络连接,〖1234〗-没有任何服务正在远程系统上的目标网络终结点上操作,〖64〗-指定的网络名不再可用等等。之前发生错误时简单的回还IO句柄,但有些问题由此而产生。(UDP问题:若完成键没有赋值,投递io没有进行,后期的数据会收不到)


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/xuwei2007/archive/2007/09/05/1773451.aspx

原创粉丝点击