私はCソケットを使って特定の患者モニターと通信するプログラムを作っています。私は、デバイスと通信するためにコネクションレスソケット(UDP)を使用しています。その後Cのエンディアンとソケットプログラミング
recvfrom(int socket, char *buffer, size_t length, int flags,
struct sockaddr *address, socklen_t *address_len);
私が直接構造化するためのバッファをキャストし、ntohsとntohlを使用していた。しかし、私のコンピュータやデバイスとこれまでのところ、私は患者モニタからの解析応答を得るためにこれをやっていたとのエンディアンの不一致があります例えば、バイト順を変更するには:
struct A * a = (struct A *)buffer;
Struct A b;
b.v1 = ntohs(a->v1);
b.v2 = ntohl(a->v2);
をインターネット上でいくつかの例を読んだ後、私はこれが原因コンパイラ依存パディングに間違ったアプローチであり得ることを考え出しました。しかし、私はそれについては分かりません。私は、バッファを正しい構造のC構造にun-marshallする簡単な方法が必要です。私が受け取っている構造は、予測不可能な長さと複雑さもほとんどありません。私は非マーシャリングを行うために、すばやく簡単なアプローチが必要です。
私は送信者を制御しません。送信者はネットワークバイトオーダーです。私の質問はそれだけです: - バッファを構造体にキャストしてから、この構造体のホストバイトオーダーのレプリカを作成するために、このキャスト構造体でntohsとntohlを使用するのは安全ですか?それは最速のアプローチですか?そうでない場合、最も速いアプローチは何ですか?あなたのコードは、最低でこれを行う必要があり、apointerあるa
ので、すべての
あなたがコントロールします送信者も同様ですか?彼らはネットワークのバイトオーダーでパケットを送信しますか? – hroptatyr
私はあなたの解決策が正しいと思います。コンパイラがあなたの構造体を埋め尽くさないように '__attribute __((packed))'や 'aligned(x)'を使うことができます。 – hroptatyr
データをワイヤに置くときにネットワークバイトオーダーに変換し、ワイヤを離すときにホストオーダーに変換します。 –