CodeProject上IOCPNet_Src源代码

losecy1994z7z8 2014-04-26 06:28:35
这是一个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函数(这只封装了与完成端口绑定的函数)与完成端口绑定了 ,而不是在工作者线程中完成的
不知道我的理解是不是有问题,求大家帮帮解答一下???谢谢!!!!
...全文
192 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧