2016-07-24 5 views
0

私のプロジェクトには、一方向のみでしか話せないSender/Receiverフレームワークが含まれています。受信者から送信者へのリターンチャネルはありません。 送信者は、zlibを使用して受信者に送信するデータの一部を圧縮します。zlibストリームを再構築する

私の受信機をクラッシュ/再起動/再起動に復元したいのですが、何とかランダムな点からzlibストリームに参加できますか?

Z_SYNC_FLUSHを使用する送信者/受信者。

私が持っていたいくつかのアイデア:

  1. がディスクに状態の構造を保存し、受信機の再起動後にそれらをリロードします。
  2. Z_SYNC_FLUSHをZ_FULL_FLUSHに置き換えます。

私はzlib圧縮データの最初のチャンクを保存してみましたが、受信機を再起動して、最初のチャンクを再送信してからランダムなチャンクからストリームを続けると、それは固い解決策ですか、それとも単なる運でしたか?

Z_FULL_FLUSHに置き換えても差がないようです。

これを回避する別の方法がありますか?私は何かを逃したと思いますか?

どうもありがとう、
ジェイソン

答えて

0

はあなたがいない歴史を持ついくつかの点で解凍を始めることができることを保証するためには、Z_FULL_FLUSHを使用する必要がありますまたは単にストリームを終了し、新しいものを開始します。

元のためには、圧縮されたデータにランダムに見られるようにそうだろう9バイト00 00 ff ff 00 00 00 ff ff、結果として二つのマーカーを挿入するためにZ_FULL_FLUSH続いZ_SYNC_FLUSHを行うことができます。前者のzlibストリームの終わりと次のzlibストリームの開始点の間に十分な大きさのマーカーを挿入するだけで、同じことができます。

+0

送信者が単方向リンクを介して受信者に接続されているため、受信者が再起動して新鮮なストリームが必要であることを送信者が知ることができないため、 Z_FULL_FLUSHを再試行しましたが、「間違ったヘッダーチェック」でZ_DATA_ERRORが発生しました。InflateSync()を呼び出した後にInflateSync()を呼び出そうとしましたが、InflateSync()はZ_OKを返します。 – Eldad

+0

送信側を制御できない場合は、ストリームの途中で再起動する方法がありません。 'Z_FULL_FLUSH'は' inflate() 'ではなく、' deflate() 'のみを意味します。 –

+0

Mark、 私が説明したシナリオの説明がありますか?私の質問では可能ですか?私はストリームの最初のチャンク(deflate()の最初の出力)を取り出し、再起動した後に受信側に送信し、ストリームからランダムなチャンクを選んで受信側にも送信します。 ランダムチャンクが正常に膨張しましたが、どうすれば可能ですか?私が間違っていない場合、inflate関数は、この場合失われている以前のデータからシーケンスを探しています。 – Eldad

関連する問題