这是我学习完成端口的例子,第一次数据接受结束后,进行第二次投递,
为什么会出错? 高手们帮我看看好不?DWORD WINAPI ServerWorkerThread(LPVOID lParam)
{
CTCPSvrd* pTCPSvrd = (CTCPSvrd*)lParam;
CPERIOHandleData* pHandleData = NULL;
    CPERIOData*       pIOData  = NULL;
DWORD             dwBytesTransfered = 0;
DWORD   dwRecvBytes =0;
DWORD             dwFlags = 0;
int state = 0;
while (TRUE)
{
//阻塞
int nRet = GetQueuedCompletionStatus(pTCPSvrd->m_hCompetionPort, &dwBytesTransfered, (DWORD*)&pHandleData, (LPOVERLAPPED*)&pIOData, INFINITE);
if (nRet == FALSE || (nRet == TRUE && dwBytesTransfered == 0))
continue;
switch(pIOData->m_nIOType)
{
case IORead:
printf("dwBytesTransfered = %d, len = %d, head = %d\n",  dwBytesTransfered, pIOData->m_DataBuf.len, pIOData->m_bPackHead);
if (pIOData->m_DataBuf.len == dwBytesTransfered )
{
if( pIOData->m_bPackHead == TRUE )
{
PACKAGE_HEAD *pPackageHead = (PACKAGE_HEAD *)(pIOData->m_Buffer); 
pIOData->m_bPackHead = FALSE;
pIOData->m_DataBuf.len = pPackageHead->nDataLen;
pIOData->m_dwRecvBytes += dwBytesTransfered;
pIOData->m_DataBuf.buf = pIOData->m_Buffer + pIOData->m_dwRecvBytes; 
printf("nCount = %d, ver = %d, com = %d, len = %d\n", g_iTime++, pPackageHead->Version, pPackageHead->Command, pPackageHead->nDataLen);

dwFlags = 0;
pIOData->m_nIOType = IORead;
state = WSARecv(pHandleData->GetClietnSocket(),
            &(pIOData->m_DataBuf), 
            1,
            &dwRecvBytes,
            &dwFlags,
            &pIOData->m_OVerlapped, 
            NULL);
if (state == SOCKET_ERROR)
{
if(WSAGetLastError() != ERROR_IO_PENDING)
{
continue;
}
}

}
else///接收到的是包体

pIOData->m_dwRecvBytes += dwBytesTransfered;

char* p = pIOData->m_Buffer;
p += sizeof(PACKAGE_HEAD);
printf("recv: %s\n", p);


///继续请求 请求下一个数据包的包头


memset(&pIOData->m_OVerlapped, 0, sizeof(OVERLAPPED));
memset(pIOData->m_Buffer, 0, sizeof(pIOData->m_Buffer));
pIOData->m_nIOType = IORead;
pIOData->m_DataBuf.buf = pIOData->m_Buffer;
pIOData->m_DataBuf.len = sizeof(PACKAGE_HEAD);
pIOData->m_bPackHead = TRUE;
pIOData->m_dwRecvBytes = 0;
dwFlags = 0;
state = WSARecv(pHandleData->GetClietnSocket(),
            &(pIOData->m_DataBuf), 
             1,
            &dwRecvBytes,
            &dwFlags,
            &pIOData->m_OVerlapped, 
            NULL);
if (state == SOCKET_ERROR)
{
printf("Recv Failed!\n");
if(WSAGetLastError() != ERROR_IO_PENDING)
{

continue;
}

}
else///接收的数据还不完整
{
pIOData->m_DataBuf.len -= dwBytesTransfered;
pIOData->m_dwRecvBytes += dwBytesTransfered;
pIOData->m_DataBuf.buf = pIOData->m_Buffer + pIOData->m_dwRecvBytes;
dwFlags = 0;
pIOData->m_nIOType = IORead;
state = WSARecv(pHandleData->GetClietnSocket(),
            &(pIOData->m_DataBuf), 
            1,
            &dwRecvBytes,
            &dwFlags,
            &pIOData->m_OVerlapped, 
            NULL);
if (state == SOCKET_ERROR)
{
if(WSAGetLastError() != ERROR_IO_PENDING)
{
continue;
}
}
}
break;
case IOWrite:
break;
}//end switch
}
return 0;
}就是在会走到
if (state == SOCKET_ERROR)
{
printf("Recv Failed!\n");
if(WSAGetLastError() != ERROR_IO_PENDING)
{
continue;
}

解决方案 »

  1.   

    这里我的测试程序,为什么收不到消息呢,而
    加上Sleep(200);就可以收到,
    recv是阻塞的,不加不会有问题呀!while(q != 'q')
    {
    char buf[5000] = {0};
    PACKAGE_HEAD head = {0};
    head.wVersion = 10;
    head.wCommand = 25;
    head.wIODataID = 1;
    head.wIOHandleID = 1;
    head.wDataLen = 0;
    char test[5000] = {0};
    scanf("%s", test);
    head.wDataLen = strlen(test);

    memcpy(buf, &head, sizeof(head));
    char* p = buf + sizeof(head); memcpy(p, test, strlen(test)); send(ClientSocket, buf, head.wDataLen + sizeof(head), 0); Sleep(200);
    char recvData[5000] = {0};
    int nRecvCount = recv(ClientSocket, recvData, 5000, 0);
    char* pRecv = recvData;
             pRecv += sizeof(PACKAGE_HEAD);
    printf("recv size = %d, : %s\n", nRecvCount, pRecv);
    q = getchar(); }
      

  2.   

    自己给自己顶,为什么要加
    sleep(200)呢!