おそらく、さまざまなタイプのサイズの違いであり、ネットワークを介してそれらを送受信しています。サイズが一致しないため、プロトコルは非同期になります。
Linux はx86_64にLP64 データ モデルint
を使用するため、まだ 32 ビットですが、long
64 ビットです。x86long
では 32 ビットです。
幸いなことに、C 標準では、stdint.h
ヘッダー ファイルでいくつかの固定幅整数型が定義されています。これを含めると、n が 8、16、32、または 64 の符号なしタイプと符号付きタイプを使用できます。ネットワークプロトコルで考慮すべきもう 1 つのことは、バイト オーダーです。POSIX は、32 ビット整数と 16 ビット整数をホスト順序からネットワーク順序に、またはその逆にそれぞれ変換する関数、、、およびを提供します。uintn_t
intn_t
htonl
htons
ntohl
ntohs
編集:
Variable Length Coder が指摘しているように、構造体全体の送信も移植性がありません (x86 と x86_64 の間ですが)。ネットワーク経由で構造体を送信する場合は、一度に 1 つずつ送信し、受信側の適切なフィールドに割り当てる必要があります。
編集2:
size_t
また、移植可能なデータ型ではありません。プロトコルに適した明示的なサイズの型を選択する必要があります。おそらくuint32_t
良い選択です。
また、 のすべてのサイズ修飾子は標準の/ /型printf
に基づいているため、マクロを使用してフォーマット文字列を作成する必要があります。例えば:short
int
long
<inttypes.h>
#include <inttypes.h>
/* ... */
int32_t signed32;
uint16_t unsigned16;
printf("Signed 32 is %"PRIu32" and unsigned 16 is %"PRId16"\n", signed32, unsigned16);
あなたのシステムはこれらのヘッダファイルに man ページを持っているかもしれません (私の fedora システムは持っています) ので、コマンドプロンプトで使用できます
man stdint.h
と
man inttypes.h
これらのヘッダーで定義されているタイプ、マクロ、および関数に関する詳細情報を取得するには。