socket如果采用的是阻塞模式,就会出现你这种情况。
如果不是阻塞模式,可能会好些。

解决方案 »

  1.   

    SOCKET为非阻塞模式
    读SOCKET缓冲区数据函数:int sock::WaitRead(int sec, int msec, int MaxLen, char *buf, int *buflen)
    { int ret;
    int fd;
        fd_set readbits;
        struct timeval timer;
    int ReadSock;
    int numbytes,bsize;
    int RevLen = 0; if (SockMode == SOCKMODESERVER)
    ReadSock = SConnect;
    else
    ReadSock = SClient; assert( ReadSock != 0);     fd = ReadSock;

    timer.tv_sec = sec;
        timer.tv_usec = msec; 
        FD_ZERO(&readbits);
        FD_SET(fd, &readbits);
        ret = select(fd+1, &readbits, NULL, NULL, &timer);#ifdef _WIN32
        if (FD_ISSET(fd, &readbits)) //有数据
        {
    ioctlsocket(ReadSock, FIONREAD, (u_long *)&numbytes);
    // bsize = min(numbytes, MaxLen);
    RevLen = recv(ReadSock, (char *)buf, MaxLen,0);
        }
    #else
        if (FD_ISSET(fd, &readbits))
        {
    ioctl(ReadSock, FIONREAD, &numbytes);
    // bsize = min(numbytes, MaxLen);
    RevLen = recv(ReadSock, buf, MaxLen,0);
        }
    #endif
       else   //无有数据
      {
    return 0; //ÎÞ±¨ÎÄ
      }// assert(RevLen != -1);
    if (RevLen == -1)
    ret = -1;
    else
    {
    *buflen = RevLen;
    ret = 1;
    } return ret;
    }