2016-07-24 27 views
0

我的項目包含一個發送方/接收方框架,只能單向交談,沒有從接收方到發送方的返回信道。 發送方使用zlib壓縮發送給接收方的部分數據。重建zlib流

我想使我的接收器對崩潰/重新啓動/重新啓動有彈性,是否有可能以某種方式從一個隨機點加入zlib流?

發送方/接收方都使用Z_SYNC_FLUSH。

一些想法我有:

  1. 保存狀態結構到磁盤和接收器重新啓動後重新載入。
  2. 將Z_SYNC_FLUSH替換爲Z_FULL_FLUSH。

我試圖保存的zlib壓縮數據的第一塊,重啓接收器,比一次後重新發送第一個塊從隨機塊不斷流,它似乎工作 - 我不明白爲什麼,這是一個堅實的解決方案還是隻是一個運氣?

替換爲Z_FULL_FLUSH似乎沒有任何區別。

是否有其他解決方法?你覺得我錯過了什麼嗎?

非常感謝,
傑森

回答

0

爲了保證你可以在某些時候有沒有歷史開始減壓,你必須使用Z_FULL_FLUSH或者乾脆終止流,並開始一個新的。

對於前者,你可以做一個Z_SYNC_FLUSH後跟一個Z_FULL_FLUSH以插入導致9個字節00 00 ff ff 00 00 00 ff ff,這將是不可能的兩個標誌是在壓縮數據隨機觀察。你可以對後者做同樣的事情,只需在前一個zlib流的結尾和下一個zlib流的開始之間插入一個足夠大的標記。

+0

我不能要求發送方結束流並開始新流,因爲發送方通過單向鏈路連接到接收方,發送方無法知道接收方重新啓動並需要新流。我試着在從Inflate(),InflateSync()返回Z_OK但Inflate()返回相同的錯誤後得到Z_DATA_ERROR,然後調用InflateSync()來調用InflateSync()。 – Eldad

+0

如果您不控制發送端,則無法在流中間重新啓動。 'Z_FULL_FLUSH'只對'deflate()'有意義,而不是'inflate()'。 –

+0

謝謝馬克, 你有解釋我的問題描述如何在我的問題是可能的?我將流的第一部分(deflate()的第一個輸出)重新發送到接收器,然後從流中選取一個隨機塊並將其發送給接收器。 隨機塊膨脹成功,它怎麼可能?如果我沒有錯,膨脹函數正在尋找在這種情況下丟失的先前數據的序列。 – Eldad