CodeProject上IOCPNet_Src源代码
这是一个IOCP的封装类 其中有一段代码不懂
int OIOCPNet::PrepareSocket(int Mode, OBufferedSocket *pBuffSockOld)
{
BOOL bError;
OBufferedSocket *pBuffSock;
bError = 0;
if (PREPARE_SOCKET_INIT == Mode
{
// Create a new buffered socket.
pBuffSock = CreateBufferedSocket(Mode, 0);
if (0 == pBuffSock)
{
m_pEL->ErrLog(ERRLOC, "CreateBufferedSocket is failed.");
bError = 1;
goto ErrHand;
}
}
else
{
pBuffSock = CreateBufferedSocket(Mode, pBuffSockOld);
if (0 == pBuffSock)
{
m_pEL->ErrLog(ERRLOC, "CreateBufferedSocket is failed.");
bError = 1;
goto ErrHand;
}
}
if (RET_FAIL == SetInitialAcceptMode(pBuffSock))
{
m_pEL->ErrLog(ERRLOC, "SetInitialAcceptMode is failed.");
bError = 1;
goto ErrHand;
}
if (0 == AssociateSocketWithCompletionPort(pBuffSock->Socket, m_hCompletionPort, (DWORD)pBuffSock))
{
m_pEL->ErrLog(ERRLOC, "AssociateSocketWithCompletionPort is failed. Error Code = %d", GetLastError());
bError = 1;
goto ErrHand;
}
ErrHand:
if (1 == bError)
{
return RET_FAIL;
}
return RET_SUCCESS;
} // PrepareSocket()[/align]
这个函数是在主线程中被调用 ,并且 SetInitialAcceptMode函数中调用了acceptEx异步函数,而acceptEx异步函数只 是投递IO数据包 ,由工作者线程中的GetQueuedCompletionStatus接受完成的数据包 (就是连接的客户端)并与完成端口绑定。
问题是:acceptEx函数会立刻返回 ,但客户端并不一定就立刻连接上来了 , 但这段代码后面立刻就调用了AssociateSocketWithCompletionPort函数(这只封装了与完成端口绑定的函数)与完成端口绑定了 ,而不是在工作者线程中完成的
不知道我的理解是不是有问题,求大家帮帮解答一下???谢谢!!!!