IOCP wsarecv调用等不到完成信息
我是用WSASynSelect来得到有连接请求,然后左右socket都申请必要的内存并绑定到完成端口上.
switch(WSAGETSELECTEVENT(lParam))
{
case FD_ACCEPT:
{
if ((socketAccept=WSAAccept(wParam,NULL,NULL,NULL,0)) == INVALID_SOCKET)
{
break;
}
socketServer=g_ThreadPool.CreateServerSocket( \
g_ThreadPool.m_MapInfo[wParam].DestIP, g_ThreadPool.m_MapInfo[wParam].DestPort);
if (INVALID_SOCKET==socketServer)
{
closesocket(socketAccept);
socketAccept=INVALID_SOCKET;
break;
}
pPerSocketContextClient=g_ThreadPool.UpdateCompletionPort(socketAccept,socketServer,IoRead,true);
if (NULL==pPerSocketContextClient)
{
break;
}
pPerSocketContextServer=g_ThreadPool.UpdateCompletionPort(socketServer,socketAccept,IoRead,true);
if (NULL==pPerSocketContextServer)
{
break;
}
nRet=WSARecv(socketAccept,&(pPerSocketContextClient->pPerIoContext->wsabuf),1,&dwRecvNumBytes, \
&dwFlag,&(pPerSocketContextClient->pPerIoContext->OverLapped),NULL);
if ((SOCKET_ERROR==nRet) && (ERROR_IO_PENDING!=WSAGetLastError()))
{
g_ThreadPool.FreeAndCloseSocket(pPerSocketContextClient);
break;
}
nRet2=WSARecv(socketServer,&(pPerSocketContextServer->pPerIoContext->wsabuf),1,&dwRecvNumBytes2, \
&dwFlag2,&(pPerSocketContextServer->pPerIoContext->OverLapped),NULL);
if ((SOCKET_ERROR==nRet2) && (ERROR_IO_PENDING!=WSAGetLastError()))
{
g_ThreadPool.FreeAndCloseSocket(pPerSocketContextServer);
break;
}
break;