2016-12-30 11 views
0

Я пытаюсь отправить некоторые сжатые данные zlib поверх сокета, а затем раздувать его в другом коде после получения из сокета. Я могу успешно сжать первый пакет, однако понемногу пакеты не получают несжатого с функцией inflate, возвращающейся с кодом ошибки -2. Ниже приведены фрагменты кода:сжатие и декомпрессия zlib

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); 

`

Это выход 1 строка отправлена:

INFO | 2016-12-30 | 21: 33: 37,875443 |||||| TestZlib.cpp | main | 481 | Uncompressed [Hello] Length [14] | секунд для декодирования сообщение Is: [54]

Для второго и последующих строк, я получаю ту же строку в качестве входных данных, но я не могу распаковать его:

INFO | 2016-12- 30 | 21: 33: 37,875739 |||||| TestZlib.cpp | main | 481 | Несжатый [] Длина [14] |

ответ

0

-2 является Z_STREAM_ERROR, который предполагает, что вы каким-то образом затирается структуру данных Zlib поток где-то между, когда вы делаете inflateInit() и inflate(). Вы должны проверить все свои memset() и memcpy() s, чтобы убедиться, что они находятся в пределах памяти, на которую они должны писать.

Вы также должны прочитать documentation for zlib in zlib.h, а также посмотреть на example of how в inflate() и deflate() функции должны быть использованы. Например, успех полной инфляции указывается не на Z_OK, а на Z_STREAM_END. Также вы не проверяете коды ошибок на функциях deflate*.

Наконец, вы должны проверить и подтвердить свое использование deflate() и inflate() в одной программе без сокета между ними, чтобы убедиться, что у вас это прямо, прежде чем вы начнете усложнять ситуацию.

+0

спасибо Mark ... Его работа, когда я делаю инфляцию и дефляцию в том же коде. Его единственный, когда я пропускаю его через сокет, он перестает работать. – chetan

+0

Я сделал некоторые изменения, теперь функция deflate возвращает мне 0 (Z_OK). Однако на этот раз надувает мне -3 (DATA_ERROR). – chetan

+0

Предполагая, что код работает без сокета, вы точно не передали данные через сокет. Сравните то, что вы накормили сокет, с тем, что вышло на другом конце, байт для байта, чтобы узнать, в чем проблема. –