void CIocpCtrl::OnExecute()
{
SPerHandleData* pstPerHandleData;
SPerIoData* pstPerIoData;
CCPSock* poSock;
CCpListener* poListener;
BOOL bRet;
DWORD dwByteTrabsferred;
while(true)
{
pstPerHandleData = NULL;
pstPerIoData = NULL;
dwByteTrabsferred = 0;
bRet = GetQueuedCompletionStatus(
m_hCompletionPort,
&dwByteTrabsferred,
(PULONG_PTR)&pstPerHandleData,
(LPOVERLAPPED*)&pstPerIoData,
INFINITE);
// 检查是否是线程退出
if(NULL == pstPerHandleData)
{
return;
}
//当有客户端请求创建连接时
if(pstPerHandleData->bListen)
{
// for listen event
poListener = (CCpListener*)pstPerHandleData->ptr;
if(NULL != poListener && NULL != pstPerIoData)
{
poListener->OnAccept(bRet, pstPerIoData);
//printf("Accpet Count:%d \n", InterlockedIncrement((LONG*)&m_acceptCount) );
}
else
{
SDASSERT(false);
}
}
else
{
//for non-listen event
poSock = (CCPSock*)pstPerHandleData->ptr;
if ( NULL == poSock )
{
continue;
}
if( FALSE == bRet || NULL == pstPerIoData )
{
if (::WSAGetLastError()!=ERROR_IO_PENDING)
{
INFO(_SDT("[%s:%d]CCPSock connID=%d error %d, close it"),
MSG_MARK, poSock->GetConnectionID(), ::WSAGetLastError());
poSock->OnClose();
}
}
else
{
switch(pstPerIoData->nOp)
{
case IOCP_RECV:
{
poSock->DecPostRecv();
if (dwByteTrabsferred > 0)
{
poSock->OnRecv(dwByteTrabsferred);
}
else
{
INFO(_SDT("[%s:%d]CCPSock connID=%d error %d, close it, socket :%d "),
MSG_MARK, poSock->GetConnectionID(), ::WSAGetLastError(), poSock->GetSock());
poSock->OnClose();
}
}
break;
case IOCP_SEND:
{
poSock->DecPostSend();
if (dwByteTrabsferred > 0)
{
poSock->OnSend(dwByteTrabsferred);
}
else
{
INFO(_SDT("[%s:%d]CCPSock connID=%d error %d, close it"),
MSG_MARK, poSock->GetConnectionID(), ::WSAGetLastError());
poSock->OnClose();
}
}
break;
case IOCP_CLOSE:
{
poSock->OnClose(false);
}
break;
default:
;
}
}
}
}
}
FR:海涛高软(hunk Xu) QQ技术交流群:386476712