首頁 > 後端開發 > C++ > 如何從長度前綴的 TCP 流中可靠地反序列化結構?

如何從長度前綴的 TCP 流中可靠地反序列化結構?

DDD
發布: 2025-01-03 07:08:40
原創
548 人瀏覽過

How to Reliably Deserialize a Struct from a Length-Prefixed TCP Stream?

在長度前綴後反序列化來自TCP 接收的結構

問題:

反序列化自訂時透過TCP 從單獨的機器接收結構體時,遇到異常: 「System.Runtime.InteropServices.SafeArrayTypeMismatchException」。

原始實作:

該結構包括用於在發送之前和之後準備和檢索資料的序列化方法。發送的位元組中會新增一個標頭,以指示傳入資料的大小,格式為「l=xxxx;」。接收端搜尋該標頭,提取資料包字節,並嘗試反序列化它們。

異常原因:

根本原因在於依賴用於決定封包長度的字串。這種方法可能會導致透過網路傳輸資料時出現不一致。

解決方案:

實現長度前綴:

不要使用標頭字串,而是實作適當的長度字串前綴。這涉及到向發送的每個「資料包」添加固定標頭,表示資料的長度。該長度轉換為字節,結果為 4 個位元組。然後附加資料頭和資料包本身。

封包結構:

[長度(4 位元組)][標頭(1 位元組)][資料(x byte(s))]

封包接收與解析:

  1. 讀取前4個位元組(Length),轉換並賦值給整型變數。
  2. 讀取下一個位元組(Data Header)並將其儲存在變數中。
  3. 將 x 個位元組讀取到位元組數組中,其中 x 是步驟 1 中的整數。
  4. 使用步驟 2 中的資料標頭以確定如何處理資料。

以上是如何從長度前綴的 TCP 流中可靠地反序列化結構?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板