2016-12-30 5 views
0

Ich versuche, einige zlib komprimierte Daten über Socket zu senden und dann in einem anderen Code nach dem Empfang von Socket aufblasen. Ich bin in der Lage, das erste Paket erfolgreich zu dekomprimieren, jedoch werden die nachfolgenden Pakete nicht dekomprimiert, wenn die Inflate-Funktion mit -2 Fehlercode zurückkehrt. Im Folgenden sind die Code-Schnipsel:zlib Komprimierung und Dekomprimierung

Server.cpp

`// Innenhaupt

{ 

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

`

Dies ist der Ausgang des ersten Zeichenkette gesendet:

INFO | 2016-12-30 | 21: 33: 37,875443 |||||| TestZlib.cpp | main | 481 | Unkomprimiert [Hallo] Länge [14] | Sekunden für die Nachricht Decodierung ist: [54]

Für die zweite und die folgenden Zeichenfolgen, ich die gleiche Zeichenfolge als Eingabe erhalten, aber ich bin nicht in der Lage sie entpacken:

INFO | 2016-12- 30 | 21: 33: 37,875739 |||||| TestZlib.cpp | main | 481 | Unkomprimiert [] Länge [14] |

Antwort

0

-2 ist Z_STREAM_ERROR was darauf schließen lässt, dass Sie irgendwie die zlib Strom-Datenstruktur irgendwann zwischen verprügelt, wenn Sie die inflateInit() tun und die inflate(). Sie sollten alle Ihre memset() s und memcpy() s überprüfen, um sicherzustellen, dass sie innerhalb der Grenzen des Speichers bleiben, in den sie schreiben sollen.

Sie sollten auch die documentation for zlib in zlib.h lesen, sowie die example of how die inflate() und deflate() Funktionen sollten verwendet werden. Zum Beispiel wird der Erfolg der vollständigen Inflation nicht durch Z_OK angezeigt, sondern durch Z_STREAM_END. Außerdem suchen Sie nicht nach Fehlercodes auf den deflate* Funktionen.

Schließlich sollten Sie testen und verifizieren Sie Ihre Verwendung von deflate() und inflate() in einem einzigen Programm ohne einen Sockel dazwischen, um sicherzustellen, dass Sie gerade haben, bevor Sie beginnen, Dinge zu komplizieren.

+0

danke Mark ... Es funktioniert, wenn ich Inflation und Deflation in den gleichen Code. Es ist nur, wenn ich es durch die Steckdose gebe, es funktioniert nicht mehr. – chetan

+0

Ich habe einige Änderungen vorgenommen, jetzt deflate Funktion gibt mir 0 zurück (Z_OK). Allerdings blase ich diesmal -3 (DATA_ERROR) zurück. – chetan

+0

Angenommen, der Code funktioniert ohne den Socket, dann haben Sie die Daten nicht zuverlässig über den Socket übertragen. Vergleichen Sie, was Sie dem Socket zugeführt haben, was Byte für Byte am anderen Ende herauskam, um zu sehen, was das Problem ist. –

Verwandte Themen