0
votes

I am trying to send some zlib compressed data over socket and then inflating it in another code after receiving from socket. I am able to de compress first packet successfully, however subsequen packets are not getting uncompressed with inflate function returning with -2 error code. Following are the code snippets:

Server.cpp

` //Inside 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);

`

This is the output of 1st string sent :

INFO|2016-12-30|21:33:37,875443||||||TestZlib.cpp|main|481|Uncompressed[Hello] Length[14]| Seconds For Decoding The Message Is : [54]

For the Second and Subsequent strings, I get the same string as input but I am not able to decompress it:

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

1

1 Answers

1
votes

-2 is Z_STREAM_ERROR which suggests that you have somehow clobbered the zlib stream data structure sometime between when you do the inflateInit() and the inflate(). You should check all your memset()s and memcpy()s to make sure that they are staying within the bounds of the memory they are supposed to be writing to.

You should also read the documentation for zlib in zlib.h, as well as look at the example of how the inflate() and deflate() functions should be used. For example, the success of complete inflation is indicated not by Z_OK, but rather Z_STREAM_END. Also you are not checking for error codes on the deflate* functions.

Lastly, you should test and verify your usage of deflate() and inflate() in a single program without a socket in between, to make sure you've got that straight before you start to complicate things.