偶然会有接收不到数据的情况。read这个函数会返回0 //printf("\n没有获取到0x02开头的数据\n"出错)

偶尔会有接收不到数据的情况。read这个函数会返回0 //printf("\n没有获取到0x02开头的数据\n"出错);
C/C++ code

BYTE  recv_msg(int g_CommType, long g_hComm, BYTE *msg, DWORD *RxLen, int time_out,BYTE *cmd)
{
    BYTE    buf[1024*8];
    DWORD    iLen;


    WORD    crc;
    WORD    crc_t;
    BYTE    socrc[2];
    BYTE    poscrc[2];

    fd_set    recv_mask;
    struct timeval timeout;
    int    ret;
    int    sock;
    int    flags;
    int j;

    memset(buf,0,sizeof(buf));
    static int   tmsscn =0;
    
    //0x01    Modem(拨号)
    sock = g_hComm;
    
    *RxLen = 0;
    while(1)
    {
        FD_ZERO(&recv_mask);
        FD_SET(sock, &recv_mask);
        timeout.tv_sec = time_out;    //设置超时s
        timeout.tv_usec = 0;
        ret = select(sock+1, &recv_mask, NULL, NULL, &timeout);
        if (ret < 0)            //出错
        {    
            printf("ret=%d",ret);
            printf("\n\n");
            return -1;        //未知错误
        }
        if (ret == 0)            //如果超时,再读一次
        {    
            sock = g_hComm;
            FD_ZERO(&recv_mask);
            FD_SET(sock, &recv_mask);
            timeout.tv_sec = time_out;    //设置超时s
            timeout.tv_usec = 0;
            ret = select(sock+1, &recv_mask, NULL, NULL, &timeout);
            while(ret <=0)
            {    
                sock = g_hComm;
                FD_ZERO(&recv_mask);
                FD_SET(sock, &recv_mask);
                timeout.tv_sec = time_out;    //设置超时s
                timeout.tv_usec = 0;
                ret = select(sock+1, &recv_mask, NULL, NULL, &timeout);
            }
        }
        else 
        {    
            if (FD_ISSET(sock, &recv_mask))    //接收
            {
                /* 读取第一个STX标志 */   
                do
                {    
                    memset(buf, 0, sizeof(buf));
                    ret = read(sock, buf, 1);
                    printf("buf[0]=%02x\t",buf[0]);
                    if (ret != 1)
                    {
                        memset(buf, 0, sizeof(buf));
                        ret = read(sock, buf, 1);
                        printf("\nret=%d\n",ret);

                        //printf("\n没有获取到0x02开头的数据\n");
                              //printf("ERR_NO_STX");
                        //return ERR_NO_STX;
                    }
                } while(buf[0] != STX);
                
                /* 读取一个字节命令码 */
                ret = read(sock, &buf[1], 1);
                printf("buf[1]=%02x",buf[1]);
                if((buf[1]< HNAD)||(buf[1]> OVER))
                {
                    printf("\n命令字错误\n");
                    return ERR_CMD;
                }
                *cmd = buf[1];
                
                /* 读取两个字节的返回码 */
                ret = read(sock, &buf[2], 2);
                if(buf[2] != 0x00)
                {
                    return ERR_CMD;
                }
                
                
                /* 读2个字节的数据报文长度 */
                ret = read(sock, &buf[4], 2);
                if (ret == 0)    //正常关闭
                {
                    return 0;
                }
                else if (ret < 0) //socket关闭或链接断了
                {
                    return 0;
                }
                else if (ret != 2)
                {
    
                    return 0;
                }
                iLen = buf[6]*256 + buf[15];

                ret = read(sock, &buf[HEAD_SIZE], iLen+2); //读取数据长度+LRC(2)
                if (ret == 0)      //正常关闭
                {
                    return 0;
                }
                else if (ret < 0) //socket关闭或链接断了
                {
                    return 0;
                }
                else if (ret != iLen+2)
                {
                    return 0;
                }

                KKK = KVC16((BYTE*)&buf[0], iLen+HEAD_SIZE,0);
                VCT(crc,socrc);

                crc_t = PPT(&buf[HEAD_SIZE+iLen]);
                VCD(crc_t,poscrc);

                if (crc != crc_t)
                {
        
                    return ERR_LRC;
                }    
                *RxLen = iLen;
                return 1;
                
            }
        }
    }
}