2016-12-28 4 views
2

Cでデータをシリアライズする方法をウェブ全体から検索して、TCP/IPソケットを介して構造体を送ることができました。しかし、私はこの方法では、あなたはパケットのビットの位置を修正することができ、したがってそれを "事実上"直列化することができると思います。Cでmallocを使ってシリアライズ

packet *datapkt = NULL; 
datapkt = (packet*)malloc(PKT_SIZE); // Allocation of memory with this size 
datapkt->field = data; 
...... 
send(datapkt); 
free(datapkt); 

これはいい考えですか?これまでのところ私のプロジェクトで働いています。

ありがとうございます!

+2

メモリーレイアウト形式の構造を外部ホスト[endianness](https://en.wikipedia.org/wiki/Endianness)およびプラットフォーム[http://www.wikipedia.org/wiki/Endianness]にプッシュする際には注意が必要です。パッディングとパッキング](http://stackoverflow.com/questions/4306186/structure-padding-and-packing)がリストの一番上にあります。あなたがやっていることが "働いている"なら、偶然ではなくデザインによってそうしていることを確認してください。 – WhozCraig

答えて

0

1. Endianness 
2. Compiler padding 

最初のポイントは、データがシステムのエンディアンに応じて、異なる形を取るようになります。これは1バイトよりも大きい型の場合の問題です。

コンパイラが構造内のメンバー間にバイトを追加していないことを確認する必要があります。これはコンパイラプラグマで行うことができます。

0

あなたのアプローチに深刻な欠陥があります。 構造のメモリレイアウトには何の影響もありません。コンパイラは、構造体の間にパディング・バイトを追加することがあります。接続の両端に異なるコンパイラとCPUがある場合、単純な構造体を使用するアプローチは失敗します。異なるハードウェア上の異なるエンディアンも言及していません。

したがって、それは良い考えではありません。

0

ローカルのスレッド/プロセス通信を介してシリアル化するための構造体を使用することは、同じコンパイラおよびコンパイルフラグでも問題ありません。 しかし、ネットワーク通信のための良い考えではありません。ネットワーク上のクライアントが異なるCPUアーチまたはオペレーティングシステムを持つ可能性があり、structメンバーのメモリ割り当てが異なるマシンで一定であるという保証はありません。たとえば、X86およびX86_64または他のアーキテクチャ/コンパイラではsizeof(int)が異なる場合があります。メモリレイアウトはコンパイラによって定義され、異なるオペレーティングシステムであっても異なるマシン上で変化する可能性があり、パディングとエンディアンも入ってきて、メモリレイアウトも変更されます。あなたは二つのことを考慮する必要がこれを行う際

関連する問題