0

ソケットを介してデータを圧縮して送信するアプリケーションがあり、受信したデータはリモートマシンに書き込まれます。リカバリ中に、このデータは解凍されて取得されます。圧縮/解凍は「zlib」を使用して行われます。しかし、解凍中に次の問題がランダムに発生します。

zlib inflate()は、.xls、.qbwなどのバイナリファイルに対してエラー「Z_DATA_ERROR」で失敗します。

アプリケーションは、ファイルから読み取られたデータを使用してループ内の「1024」バイトのデータをブロック単位で圧縮し、同じ方法で解凍します。フォーラムの投稿から、Z_DATA_ERRORの理由の1つはデータの破損によるものであることがわかりました。現在、この問題を回避するために、送信中に圧縮されたデータと受信されたデータのCRCチェックを導入しました。これが発生する理由について考えられる理由は、本当にありがたいです。(これはランダムに発生し、同じファイルに対しては別の機会に機能するため)zlib inflate()およびdeflate()の誤った処理のbcozですか? 注:必要に応じて、さらに分析するために正確なコードスニペットを投稿します!

ありがとう...ウダイ

4

1 に答える 1

0

ソケットが TCP か UDP かについては言及していません。しかし、ブロッキングとチェックサムに基づいて、私は四肢に出て、それが UDP であると推測しています。

圧縮されたパケットを UDP 経由で送信している場合、相手側で順不同で受信されるか、パケットが転送中に失われる可能性があります。

順不同や失われたパケットのようなものを正しく取得することは、TCP プロトコルを使用してすべて修正される多くの作業になります。データが順番どおりに期待どおりに到着することを保証する単純なパイプがあります。

また、受信側のコードが単純であることを確認し、スタックではなくヒープに割り当てられたバッファーに受信します (これによって引き起こされる多くのバグを見てきました)。

繰り返しますが、これは質問の詳細に基づく知識に基づく推測にすぎません。

于 2012-06-03T11:26:58.403 に答える