把一个大的图像分成64块,每块用zlib的compress2函数压缩,通过TCP协议传输。接收电脑接受数据后用uncompress解压缩。但只有1/3的块解压成功。其它的解压返回值为-3(数据错)。几天,还不知是TCP还是ZLIB的问题.请知道的提个醒,是哪个方面会出问题.谢谢.

解决方案 »

  1.   

    不用Zlib压缩,64块能全部显示。tcp传输不会掉数据吧,难道Zlib解码跟电脑有关?请碰到过此类问题的同仁,拉一把。谢谢!
      

  2.   

    如何传输的,send/recv是如何写的?
      

  3.   

    send数据是包头指明后面数据大小。recv先接收包头的长度(固定的)数据,再根据包头里指明的长度接收数据。
      

  4.   

    我希望能够看到具体的实现.包括send/recv对返回值的处理.这个也是最为关键的.然后发送数据的结构定义等.
      

  5.   

    谢谢回复。代码在单位电脑上.现在想想大至如下:
    结构:
     struct SendData
    {
     int   len; //数据长度
     POINt pt; //鼠标点
     RECT  rect;//图像位置
    };
    SendData senddata;
    senddata 赋值
    byte buff[6000];
    datalen=sizeof(senddata));
    memcpy(buff,senddata,datalen
    int comlen=compress2();//压缩数据
    memcpy(&buff[datalen],压缩数据,comlen);
    send(sock,buff,datalen+comlen,0);接收: struct RecvData
    {
     int   len; //数据长度
     POINt pt; //鼠标点
     RECT  rect;//图像位置
    };
    byte buff[6000];
    RecvData recvdata;
    recvlen=sizeof(recvdata);
    while(true)
    {
        countlen=0;
        templen=recvlen;
        while(templen>0) //接收包头
        {
            len=recv(sock,buff,templen,0);
             if(len>0)
             {
                countlen+=len;
                  templen-=len;
             }
        }
        
        memcpy(&recvdata,buff,recvlen);
        templen=recvdata.len;
        while(templen>0) //接收数据
        {
            len=recv(sock,&buff[countlen],templen,0);
            if(len>0)
             {
                  countlen+=len;
                  templen-=len;
             }    }
       int unlen;
       uncompress(&buff1,&unlen,buff[recvdata.len],countlen);有些解压缩出错  }
      

  6.   

    send也要跟recv那样对返回值进行处理.另外当recv返回小于0,即len<=0的时候,上面的代码会死循环.
      

  7.   


    做个CRC32校验.发送方和接收方对zlib加压数据都做个CRC32校验,如果一样,那么数据是没错,但还是显示错误,自然是解压的问题了.如果CRC32校验不一样,那就是你传输过程出问题了.
      

  8.   


     原代码只是对Send返回值错误的,提示信息.程序运行没有提示出错.对于recv<=0的情况.我特意不去处理,让程序继续接收数据.
      

  9.   

    这是一个好方法,可惜不会做CRC32校验.请教算法.谢谢.
      

  10.   

    zlib1.2.3 好象带MD5校验,不知如何用.谢谢.
      

  11.   


    只是测试程序。已找到是Zlib的原因。谢谢