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] |
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
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
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. –