Я пытаюсь отправить некоторые сжатые данные 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] |
спасибо Mark ... Его работа, когда я делаю инфляцию и дефляцию в том же коде. Его единственный, когда я пропускаю его через сокет, он перестает работать. – chetan
Я сделал некоторые изменения, теперь функция deflate возвращает мне 0 (Z_OK). Однако на этот раз надувает мне -3 (DATA_ERROR). – chetan
Предполагая, что код работает без сокета, вы точно не передали данные через сокет. Сравните то, что вы накормили сокет, с тем, что вышло на другом конце, байт для байта, чтобы узнать, в чем проблема. –