我设置了阻塞模式的socket,在调试通信的时候第一次的确阻塞在了recv(..)(客户端没有发送数据),可是再下一个接收循环中却出现了问题,我并没有点击发送按钮,可是服务端仍然接收到了信息,信息只有一个字节,是一个繁体字。请问高手这是怎么回事?

解决方案 »

  1.   

    void CServerSocket::ReceivingLoop()
    {
    while(m_bReceiving)
    {
    while (Receive(buf, 9) == E_SOCKET_NOT_READY)
    {
    Sleep(100);
    }
    ::SendMessage(AfxGetMainWnd()->GetSafeHwnd(), WM_Gengxin, 0, 0);
    }
    }
    int CWorkerSocket::Receive(char * outBuf, int inLen)
    {
    if (m_hSocket)
    {
       int    nCount = inLen;
            int    lenret = 0;
               char * pBuf   = outBuf;
       lenret = recv(m_hSocket, pBuf, nCount, 0);
       if (lenret == SOCKET_ERROR) 
       {
        return E_SOCKET_FAIL;
       }
       else if (lenret == 0)
       {
    // Indicate(指示,指出) the socket disconnected
    return E_SOCKET_CLOSE;
       }
       return S_SOCKET_OK;
         }
         return E_SOCKET_FAIL;
    }
      

  2.   

    再次调试发现,循环在只多进行了一次,是不是因为发送数据的实际字节数和recv(..)设置的要接收的字节数量不一致导致的啊
      

  3.   

    不会吧,你估计还是代码有问题,给你一段参考代码: memset(buffer, 0, 1025);
    timeval tm;
    fd_set set;
    tm.tv_sec = 5;
    tm.tv_usec = 0;
    while(!m_bStop)
    {
    Sleep(100);
    FD_ZERO(&set);
    FD_SET(m_sck, &set);
    int nRet = select(m_sck + 1, &set, NULL, NULL, &tm);
    if( nRet <= 0)
    {
    if(nRet < 0)//是严重错误
    m_bConnected = false;
    continue;
    } if(FD_ISSET(m_sck, &set)) //如果没有数据来,则继续轮循
    {
    int nLen = recv(m_sck, buffer, 1024, 0);
    while(nLen > 0)
    {
    buffer[nLen] = '\0';
    AddBuffer(buffer);
    nLen = recv(m_sck, buffer, 1024, 0);
    }
    if(nLen == 0)//此时表明客户端的Socket已经关闭
    {
    break;
    CloseSocket();
    }
    }
    }