我在做一个测试,只有两台机器通信,客户端上有两个相同进程不停的连接服务器,服务器从数据库中提取数据,然后发回客户端但是长时间的测试发现,偶尔有几次客户端收到的数据和服务器发出的数据不一致
每次的数据长度大约有200k,由于每次传输的数据都是相同的,而且我是用XML的格式,客户端解析失败,证明数据不准确
why?

解决方案 »

  1.   

    200k, 不可能吧,是不是200byte.
    你是如何解析server发过来的数据的,一包包的马?你的client如何区分当前数据属于某个xml呢?
    有可能是你的client解析又问题,这个200k是server发出的n个包,有可能这些数据属于多个xml文件,但是你没有区分的存入一个文件中,当然会解析错。用tcp传送数据很关键的就是包的识别和定界,不然server发出多个包,而client有可能一次读到,只是与udp不同的。
      

  2.   

    在文件很大的时候有这个可能 建议用以下方式发送 记得给分呀:
    int                 byte_left, byte_send, byte_sum;
        char                *p;    byte_left = len;
        p = buf;
        byte_sum = 0;
        while(byte_left > 0) {
            byte_send = send(sock, p, byte_left, 0);
            if(byte_send < 0) {
                perror("writing socket");
                return(-1);
            }
            else if(byte_send == 0 ){
                break;
            }
            byte_sum += byte_send;
            byte_left = byte_left - byte_send;
            p = p + byte_send;
        }    if(byte_sum != len){
            return -1;
        }
        else{
            return 0;
        }
      

  3.   

    包定界应该没有问题的,服务器和客户端每次传输的XML文件都是不同的连接,即每次连接所有的包都应该是属于一个XML的
      

  4.   

    现在我发送的时候是一次发送的,但是接收的时候是分多次,直到没有数据可读为止
    client是异步模式,server是同步模式(用多线程处理)
      

  5.   

    to  regainworld(午夜心跳) 
    我现在是这样做的,每次发送一个XML,前面都有一个32个字节的包头,里面有数据的长度,客户端就是根据这个长度来读取数据的,如果读到的数据和包头声明的不一致,客户端会返回一个错误
    所以现在客户端接收到的数据长度应该是正确的
      

  6.   

    是因为你对 send, recv 机制不明白.
      

  7.   

    我说的数据没有那么大啦。。200k??最多20k了。。但是客户端就是会丢失内容
    但是+了AfxMessageBox("s");之后。。就都能接受到了。。这个很奇怪