繁体   English   中英

zlib压缩和解压缩

[英]zlib compression and decompression

我试图通过套接字发送一些zlib压缩数据,然后在从套接字接收后将其压缩为另一个代码。 我能够成功解压缩第一个数据包,但是子序列数据包不会因带有-2错误代码返回的inflate函数而被解压缩。 以下是代码片段:

Server.cpp

`//内部Main

 { 

 z_stream defstream;
memset(&defstream, 0, sizeof(defstream));
defstream.zalloc = Z_NULL;
defstream.zfree = Z_NULL;
defstream.opaque = Z_NULL;

err = deflateInit(&defstream, Z_BEST_COMPRESSION);
if(err == Z_OK)
     {
            //do nothing
     }
    else
    {
            deflateEnd(&defstream);
            exit(1);
    }


    std::string outstring;
    int ret = 0;

    char a[6] = "Hello" ;
while(1)
    {

printf("Uncompressed size is: %lu\n", strlen(a));


printf("\n----------\n\n");

    SendCompressString(a);
    memset(a,'\0',6);
    strncpy(a,"Hello",5);
    }

    return 0;}
  int SendCompressString(char *a)

  {

    char xyx[100];


    char abc[100];


    int iLen = 0;
    int iRetval = 0;


char b[100];


char c[100];



z_stream defstream;
defstream.zalloc = Z_NULL;
defstream.zfree = Z_NULL;
defstream.opaque = Z_NULL;
// setup "a" as the input and "b" as the compressed output
defstream.avail_in = (uInt)strlen(a)+1; // size of input, string + terminator
defstream.next_in = (Bytef *)a; // input char array
defstream.avail_out = (uInt)sizeof(b); // size of output
defstream.next_out = (Bytef *)b; // output char array

// the actual compression work.
deflateInit(&defstream, Z_BEST_COMPRESSION);
deflate(&defstream, Z_FINISH);
deflateEnd(&defstream);


printf("Compressed size is: %lu\n", strlen(b));
printf("Compressed string is: %s\n", b);

strncpy(xyx,"M1234",5);
sprintf(abc,"%04d",defstream.total_out);
strcat(xyx,abc);
memcpy(xyx + 9,b,defstream.total_out);
printf("Compressed string is: [%s\n]", xyx);

printf("\n----------\n\n");
            iLen = defstream.total_out + 9;
            if ((iRetval = Send(connected, (CHAR *)xyx,&iLen , 0)) == FALSE)
            {
                    logError("ERROR IN SENDING THE DATA TO SOCKET");
                    logDebug3("Send Failed For IP Addr") ;
             } return 0;}

Client.cpp

     z_stream infstream;
     int err = 0;


    infstream.next_in = Z_NULL;
    infstream.avail_in = 0;
    infstream.zalloc = Z_NULL;
    infstream.zfree = Z_NULL;
    infstream.opaque = Z_NULL;
    err = inflateInit (&infstream);
    if(err == Z_OK)
     {
            //do nothing
     }
    else
    {
            inflateEnd(&infstream);
            exit(1);
    }


    struct timeval stop, start,start1;

    while(1)
    {
            PcktCount++;
            LogTaBLib.debug("%s|%s|%d|================== Waiting on socket %d ==============",basename(__FILE__),__func__,__LINE__, iMasterSoc);
            memset(AppMsg, '\0', MAX_PACKET_SIZE);
            pHeader = NULL;
            Datas = NULL;

            iLen1 = 9;

            if ((iRetval = Recv(iMasterSoc,(CHAR *) AppMsg,&iLen1,MSG_PEEK)) == FALSE)
            {
                    LogTaBLib.debug("%s|%s|%d|Dropped Exchange Response Receiving from Socket",basename(__FILE__),__func__,__LINE__);
                    LogTaBLib.info("%s|%s|%d| CONNECTION DOWN ",basename(__FILE__),__func__,__LINE__);
                    //break;
                    exit(1);
            }

            pHeader = (struct BCAST_HEADER_DATA *)AppMsg;



            //TWIDDLE1(pHeader->dSeqNum);
            //TWIDDLE1(pHeader->dMsgLen);


            iLen1 = atoi((const char*)(AppMsg + 5)) + 9;

            if (iLen1 < 1024)
            {

            memset(AppMsg, '\0', MAX_PACKET_SIZE);

            if ((iRetval = Recv(iMasterSoc, (CHAR *)AppMsg,&iLen1,0)) == FALSE)
            {
                    perror("The Error Is :");
                    LogTaBLib.debug("%s|%s|%d|Dropped Exchange Response Receiving from Socket",basename(__FILE__),__func__,__LINE__);
                    LogTaBLib.info("%s|%s|%d| CONNECTION DOWN ",basename(__FILE__),__func__,__LINE__);
                    //break;
                    exit(1);
            }
            }
            else
            {
                    CHAR *Ptr = NULL;
                    Ptr = (CHAR *) malloc (iLen1);
                    memset(Ptr,'\0',iLen1);
                    if ((iRetval = Recv(iMasterSoc, (CHAR *)Ptr,&iLen1,0)) == FALSE)
                    {
                    perror("The Error Is :");
                    LogTaBLib.debug("%s|%s|%d|Dropped Exchange Response Receiving from Socket",basename(__FILE__),__func__,__LINE__);
                    LogTaBLib.info("%s|%s|%d| CONNECTION DOWN ",basename(__FILE__),__func__,__LINE__);
                    exit(1);
                    }
                    free(Ptr);
                    Ptr = NULL;
                    continue;
            }


            pHeader = NULL;
            pHeader = (struct BCAST_HEADER_DATA *)AppMsg;


            //TWIDDLE1(pHeader->dSeqNum);
            //TWIDDLE1(pHeader->dMsgLen);


            iLen1 = iLen1 - 9;
            if(CompressionFlag == TRUE)
            {
                    memset(Uncompressed,'\0',MAX_PACKET_SIZE);
                    memset(CompData,'\0',MAX_PACKET_SIZE);
                    memcpy(CompData,AppMsg+9,iLen1);
                    LogTaBLib.info("%s|%s|%d| CompData Is [%s] iLen1 [%d]",basename(__FILE__),__func__,__LINE__,CompData,iLen1);

                    gettimeofday(&start, NULL);
                    infstream.avail_in = iLen1 ;
                    infstream.next_in = (Bytef *)CompData; // input char array
                    infstream.avail_out = (uInt)sizeof(Uncompressed); // size of output
                    infstream.next_out = (Bytef *)Uncompressed; // output char array

                            err = inflate(&infstream, Z_NO_FLUSH);
                            if(err == Z_OK)
                            {
                                    //      do nothing
                            }
                            else
                               {
                                    LogTaBLib.info("%s|%s|%d|Failed With [%d] ",basename(__FILE__),__func__,__LINE__,err);
                                    inflateEnd(&infstream);
                               }

                    gettimeofday(&stop, NULL);
                    LogTaBLib.info("%s|%s|%d|Uncompressed[%s] Length[%d]",basename(__FILE__),__func__,__LINE__,Uncompressed,iLen1);

            }
            iLen1 =0;

            memset(buffer,'\0',200);

`

这是发送的第一个字符串的输出:

INFO | 2016-12-30 | 21:33:37,875443 |||||| TestZlib.cpp | main | 481 | Uncompressed [Hello] Length [14] | 解码消息的秒数是:[54]

对于第二个和后续字符串,我得到的字符串与输入相同,但无法解压缩:

INFO | 2016-12-30 | 21:33:37,875739 |||||| TestZlib.cpp | main | 481 | Uncompressed [] Length [14] |

-2是Z_STREAM_ERROR这表明已以某种方式打一顿zlib的流数据结构的某个时候当您执行之间inflateInit()inflate() 您应该检查所有的memset()memcpy() ,以确保它们位于应该写入的内存范围内。

您还应该阅读zlib.h中zlib文档 ,并查看应如何使用inflate()deflate()函数的示例 例如,通过Z_OK而不是Z_STREAM_END表示完全通胀的成功。 另外,您也不会检查deflate*功能上的错误代码。

最后,您应该在单个程序中测试和验证deflate()inflate()使用情况,而不必在两者之间使用套接字,以确保在开始使事情复杂化之前就已经明白了这一点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM