クライアントがサーバーに送信する2MBのデータを圧縮し、サーバーがデータを受信して圧縮を解除し、ファイルに書き込むクライアントサーバーアプリケーションで作業しています。
一部のパケットでは圧縮解除に失敗していたため、クライアント側とサーバー側の両方のコードに MD5 サムを追加し、データの圧縮後にクライアント側で圧縮解除を使用してデバッグしました。クライアント側で uncompress 関数に渡される同じパラメーターが、サーバー側で Z_DATA_ERROR で失敗しています。データの MD5sum は同じようです。私が次に何ができるかはまったくわかりません。
サーバー側のタラは次のようになります。
int ret = uncompress((Bytef*)unCompressedBuffer, &dwUncompressedBytes, (const Bytef*) receivedBuffer+525, dwBlockLength);
if (ret == Z_OK)
{
}
else
{
std::cout << " Uncompression failed for Block: " << iBlock << std::endl;
std::cout << " PacketType: 4" << " Block Number:" << iBlock << " Length:" << dwBlockLength << "Error:" << ret << std::endl;
PrintMD5SumResult((PBYTE)receivedBuffer+525, compressedSize-525);
std::cout << " Uncompressed MD5 Checksum:0";
PrintMD5SumResult((PBYTE)unCompressedBuffer, dwUncompressedBytes);
}
}
クライアント コードは次のようになります。
int ret = compress2(l_pCompressData + 4, &destLen,
(const Bytef*) pBlockData, dwBlockSize, 6);
memcpy(m_pWriteBuffer+525, l_pCompressData, destLen);
m_dwWriteBytes = destLen+525;
std::cout << " \n Compressed MD5 Sum:0";
PrintMD5SumResult(m_pWriteBuffer, m_dwWriteBytes);
PrintMD5SumResult(m_pWriteBuffer+525, m_dwWriteBytes-525);
int ret = uncompress(m_pUnCompressData, &uncomLen, (const Bytef*)m_pWriteBuffer+525, destLen);
if(ret != Z_OK)
{
std::cout << " Uncompression has failed." << std::endl;
}
else
{
//std::cout << " UnCompressed MD5 Sum:0";
//PrintMD5SumResult((PBYTE)m_pUnCompressData, md5Output, dwBlockSize);
}
// Write the 2MB to the network
WriteDataOverNetwork(m_NetworkStream, m_pWriteBuffer, m_dwWriteBytes, &dwNumBytes, TRUE);
問題を zlib の次のコードに絞り込みましたが、理解するのに苦労しました。inflate() 関数では、 (ZSWAP32(hold)) != state->check) このステートメントは失敗しています。誰かがここで私を助けてくれますか? ここで使用される MD5sum は Boton C++ ライブラリからのものです。
case CHECK:
if (state->wrap) {
NEEDBITS(32);
out -= left;
strm->total_out += out;
state->total += out;
if (out)
strm->adler = state->check =
UPDATE(state->check, put - out, out);
out = left;
if ((
#ifdef GUNZIP
state->flags ? hold :
#endif
ZSWAP32(hold)) != state->check) {
strm->msg = (char *)"incorrect data check";
state->mode = BAD;
break;
}