如果投递第一个WSARecv时出现的不是ERROR_IO_PENDING,是否说明不能正常激活完成端口进行运作?
经过bind,listen,WSAAccept之后,投递了第一个WSARecv激活完成端口,可总是出现10045错误:
for(;;)
{
SOCKADDR saRemote;
int RemoteLen = sizeof(saRemote); if((Accept = WSAAccept(Listen, (SOCKADDR *)&saRemote, &RemoteLen, NULL, NULL))==SOCKET_ERROR)
{
/*
 * error occurs.
 */
MYTRACE(TEXT("Error occurs while accept the connection.\n"));
return;
}        if((PerHandleData = (LPPER_HANDLE_DATA)GlobalAlloc(GPTR, sizeof(PER_HANDLE_DATA)))==NULL)
{
/*
 * error occurs.
 */
MYTRACE(TEXT("Error occurs while alloc memory for PerHandleData.\n"));
return;
}
PerHandleData->Socket = Accept;
memcpy(&PerHandleData->ClientAddr, &saRemote, RemoteLen); if(CreateIoCompletionPort((HANDLE)Accept, CompletionPort, (DWORD)PerHandleData, 0)==NULL)
{
/*
 * error occurs.
 */
MYTRACE(TEXT("Error occurs while creating I/O completion port.\n"));
return;
} if((PerIoData=(LPPER_IO_DATA)GlobalAlloc(GPTR, sizeof(PER_IO_DATA)))==NULL)
{
/*
 *  error occurs while allocating memory for PerIoData.
 */
MYTRACE(TEXT("Error occurs while allocating memory for PerIoData.\n"));
return;
} ZeroMemory(&(PerIoData->Overlapped), sizeof(WSAOVERLAPPED));
PerIoData->DataBuf.buf = PerIoData->Buffer;
PerIoData->DataBuf.len = DATA_BUFSIZE;

if(WSARecv(Accept, &(PerIoData->DataBuf), 1, &dwBytes, &dwFlags, &(PerIoData->Overlapped), NULL)==SOCKET_ERROR)
{
if(WSAGetLastError()!=ERROR_IO_PENDING)
{
sprintf(szDebugString, "%d\n", WSAGetLastError());
MYTRACE(TEXT("Errors not on I/O pending.BAD LUCK!! \n"));
MYTRACE(TEXT(szDebugString));
                                     //就是总是执行到这里
return;
}
}

}//for(;;)