zlib压缩和解压缩

时间:2016-12-30 15:48:28

标签: c zlib compression

我正在尝试通过套接字发送一些zlib压缩数据,然后在从套接字接收后在另一个代码中对其进行充气。我能够成功地压缩第一个数据包,但是后续数据包没有得到解压缩,返回-2错误代码的inflate函数。以下是代码段:

Server.cpp

`//在主要内部

 { 

 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 |未压缩[Hello]长度[14] | 解码的秒数消息是:[54]

对于Second和Subsequent字符串,我得到与输入相同的字符串,但我无法解压缩它:

INFO | 2016-12-30 | 21:33:37,875739 |||||| TestZlib.cpp | main | 481 |未压缩[]长度[14] |

1 个答案:

答案 0 :(得分:1)

-2是Z_STREAM_ERROR,这表示您在执行inflateInit()inflate()之间的某个时候以某种方式破坏了zlib流数据结构。您应该检查所有memset()memcpy()以确保它们保持在应该写入的内存范围内。

您还应该阅读documentation for zlib in zlib.h,并查看应使用inflate()deflate()函数的example of how。例如,完全通胀的成功不是由Z_OK表示,而是由Z_STREAM_END表示。另外,您不会检查deflate*函数上的错误代码。

最后,您应该在单个程序中测试并验证deflate()inflate()的使用情况,而不需要套接字,以确保在开始复杂化之前就已经完成了的东西。

相关问题