首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

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

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

偶尔会有接收不到数据的情况。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;                            }        }    }} 



[解决办法]
不知道有多少前人掉在TCP Socket
send(人多)send(病少)send(财富)
recv(人多病)recv(少财富)
陷阱里面啊!
http://topic.csdn.net/u/20120210/09/51109ed0-07b9-41f2-b487-a51597f2ca01.html

热点排行