2017-05-18 15 views
0

UDPソケットを使用してC++ネットワークアプリケーションを作成しているとします。私たちは、データのそれほど小さなパックを渡すために必要なので、私たちはバイトオーダーがネットワーク1で確認しながら、このような構造を使用:フレキシブルなアレイメンバーを持つパック構造の移植可能な代替手段

struct [[gnu::packed]] datagram { 
    uint64_t timestamp; 
    uint8_t type; 
    uint32_t temperatures[60]; // whatever, just an example 
    uint8_t raw_data[]; 
}; 

我々はGNU GCCを使用していたので、私たちは利用しましたこれは建築家かもしれとして、我々は、間にパディングをしたくないので、私たちは、パックされた構造を必要とし、このような

  • 柔軟な配列メンバー
  • 充填構造

などの非標準のC++の機能私たちのネットワークプログラムは異なるアーキテクチャ上で動作するかもしれません。

そして、1年後に、GCC以外のコンパイラをサポートする必要が出てくるかもしれませんが、それはそれらをサポートしていません。

これは標準のC++で可能ですか?

もちろん、uint8_t buffer[SOME_SIZE]とmemcpyをデータグラムのすべての部分で使うことができますが、恐ろしい、本当に醜いコードを作成するための素晴らしい方法のように思えます。

+4

シリアル化ライブラリを検索して使用します。この問題は何度も解決されていますが、解決策のどれも良いものではないので何度も何度もやり直しています。 – nwp

答えて

3

[[gnu::packed]]は、任意のアーキテクチャ間でシリアライズするのはひどい方法です。そこにはまだビッグエンディアンのマシンがあります。

これを行う正しい方法は、オクテットの観点からシリアル化形式を定義し、オクテットストリーム(UDPソケットからまたはUDPソケットへ)とうまく配置された構造の間で変換することです。

これを簡単にするライブラリが多数あります。職場ではprotobufを使用しています。以前の雇用者には自家製の解決策がありました。 (このようなライブラリに対する推奨の要求は、スタックオーバーフローの明確なオフトピックです。)

+0

確かに、ネットワークバイトオーダーで構造内のデータを保持することができます。 OPを編集しました。 – marmistrz

関連する問題