0

C++ では、次のようなデータ構造があります。

struct Data 
{ 
int N; 
double R; 
char Name[20];
};

このデータは、クライアントから別のシステムのサーバーに送信する必要があります (データ構造体の配列を送信する必要がありますが、1 つずつ送信することもできます)。バイナリデータとして送信したいので、反対側でデータを抽出して同じ構造体型に入れます。

両方 (クライアントとサーバー) が同じコンパイラでコンパイルされている場合、sizeof(Data) と構造内のすべてのビット パディングは同じになります。ただし、サーバーは Linux を実行する 64 ビットであり、クライアントは 32 ビット Windows でさえある可能性があるため、データ内のデータの順序は異なる可能性があります。

私は正しいですか?この問題に対処する最善の方法は何でしょうか?

4

3 に答える 3

5

すべてのクライアントとサーバーが常に同じアーキテクチャーと OS の同じコンパイラーで構築されると仮定することは、ほとんどの場合、悪い考えです。構造体のメンバーを指定された順序でバイト ストリームとして明示的にパックおよびアンパックするコードを記述するか、データを反対側で解析できる非バイナリ形式 (JSON や XML など) に変換するコードを記述することをお勧めします。

于 2012-08-29T09:36:26.540 に答える
3

Boost.Serializationを使用してデータをマーシャリング/アンマーシャリング(つまり、データをソースコンピューター形式から送信に適した形式に変換し、その形式から宛先コンピューターで使用される形式に変換)し、Boost.Asioを使用して通信を処理できます。 。

于 2012-08-29T09:41:39.113 に答える
0

適切なプロトコル定義は、この問題の解決に役立ちます。固定長ヘッダーの後に可変長データが続きます。

このようなもの

ヘッダー***

[データサイズ] - 2 バイト

[MSG ID] - 1バイト

パケット**

[N] - 4 バイト

[R] - 8 バイト

[レン] - 2 バイト

[名前] - Len バイト

バイトを読み取り、構造を埋めます

于 2012-08-29T09:44:03.190 に答える