這是一個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函式(這只封裝了與完成埠系結的函式)與完成埠系結了 ,而不是在作業者執行緒中完成的
不知道我的理解是不是有問題,求大家幫幫解答一下???謝謝!!!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/123313.html
標籤:網絡及通訊開發
