ホームページ > バックエンド開発 > 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 バイト (長さ) を読み取り、変換して整数変数に割り当てます。
  2. 次のバイト (データ ヘッダー) を読み取り、次のバイトに格納します。変数。
  3. x バイトをバイト配列に読み取ります。ここで、x はステップからの整数です1.
  4. ステップ 2 のデータ ヘッダーを使用して、データの処理方法を決定します。

以上が長さプレフィックス付きの TCP ストリームから構造体を確実に逆シリアル化する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート