select会检测不到包吗?
如果TCP将包一次性发过来 能正常检测到,
如果TCP将包分两次发过来,SELECT有时检测不到包,这是怎么回事?

解决方案 »

  1.   

    应该不会吧,程序逻辑处理有问题吧,用select好久了,没有听说有lz的这种问题哦,
      

  2.   


    DWORD WINAPI CClientSocket::RecvThread(LPVOID lpParameter)
    {
    TRACE(_T("接收数据线程启动 \n")); CClientSocket *pClientSocket = (CClientSocket *)lpParameter;
      TRACE(_T("SOCKET Handle:%d in Thread \n"),pClientSocket->m_hClientSocket);
    int nRet = connect(pClientSocket->m_hClientSocket,(sockaddr *)&(pClientSocket->m_SAI),sizeof(sockaddr));
      if (nRet == SOCKET_ERROR)
    {
    pClientSocket->m_strLastError.Format(_T("创建连接socket发生错误,错误信息:%d"),WSAGetLastError());
     
    TRACE( pClientSocket->m_strLastError);
    TRACE(_T("  in RecvThread \n")); closesocket(pClientSocket->m_hClientSocket);
    pClientSocket->m_hClientSocket = NULL; PostMessage(pClientSocket->m_hMainWnd,WM_CONNECTMSG,0,0);
    return -1;

    } pClientSocket->m_IsSocketConnect = TRUE;
    PostMessage(pClientSocket->m_hMainWnd,WM_CONNECTMSG,1,0);
    TRACE(_T("服务器连接成功 \n"));

    pClientSocket->m_nConnectionCount = 0;
    TRACE(_T("连接成功据,设置为0 \n")); if (!pClientSocket->SendRegistration())
    return -1; while (pClientSocket->m_hClientSocket)
    {

    TRACE(_T("等待返回的数据 \n")); fd_set RecvFS;
    FD_ZERO(&RecvFS);
    FD_SET(pClientSocket->m_hClientSocket,&RecvFS);

    struct timeval timeout;
    timeout.tv_sec = WAITTIME;
    timeout.tv_usec = 0;

    nRet = select(pClientSocket->m_hClientSocket+1,&RecvFS,NULL,NULL,&timeout);
    if (nRet == SOCKET_ERROR) //select函数执行错误
    {
    pClientSocket->m_strLastError.Format(_T("监听Socket进行select出错,错误原因:%d"),WSAGetLastError());
    break;
    }
    else
    if (nRet == 0) //
    {
    TRACE(_T("监听Socket进行select等待超时\n"));
    pClientSocket->m_strLastError.Format(_T("监听Socket进行select等待超时"));
    }
    else
    {
    if (FD_ISSET(pClientSocket->m_hClientSocket,&RecvFS))
    {


    nRet = recv(pClientSocket->m_hClientSocket,(char *)pClientSocket->m_pRecvBuffer+pClientSocket->m_nRecvBufferPos,RECVBUFFER_SIZE-pClientSocket->m_nRecvBufferPos,0);
    if (nRet == SOCKET_ERROR)
    {
    if (pClientSocket->m_hClientSocket != NULL)
    {

    shutdown(pClientSocket->m_hClientSocket ,SD_BOTH );

    closesocket(pClientSocket->m_hClientSocket);
    pClientSocket->m_hClientSocket = NULL;

    }
    pClientSocket->m_nConnectionCount = -1;
    pClientSocket->m_IsSocketConnect = FALSE;

    PostMessage(pClientSocket->m_hMainWnd,WM_DISCONNECTMSG,2,0); //客户端异常主动断开

    pClientSocket->m_strLastError.Format(_T("通信异常中断,错误代码:%d"),WSAGetLastError());
    AfxMessageBox(pClientSocket->m_strLastError);
    break;
    }

    if (nRet==0)
    {
    if (pClientSocket->m_hClientSocket != NULL)
    {

    shutdown(pClientSocket->m_hClientSocket ,SD_BOTH );

    closesocket(pClientSocket->m_hClientSocket);
    pClientSocket->m_hClientSocket = NULL;

    }
    pClientSocket->m_nConnectionCount = -1;
    pClientSocket->m_IsSocketConnect = FALSE; PostMessage(pClientSocket->m_hMainWnd,WM_DISCONNECTMSG,3,0);  //服务器端主动断开

    pClientSocket->m_strLastError.Format(_T("服务器端关闭连接"));
     break;
    }

      TRACE(_T("收到数据,设置为0 \n"));
    pClientSocket->m_nConnectionCount = 0;

    if ( !pClientSocket->CheckPacket(nRet) )
    break;
    }
    }
    } //end-while return 0;
    }