2012-03-25 16 views
7

私は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ので、すべての

+0

あなたがコントロールします送信者も同様ですか?彼らはネットワークのバイトオーダーでパケットを送信しますか? – hroptatyr

+0

私はあなたの解決策が正しいと思います。コンパイラがあなたの構造体を埋め尽くさないように '__attribute __((packed))'や 'aligned(x)'を使うことができます。 – hroptatyr

+0

データをワイヤに置くときにネットワークバイトオーダーに変換し、ワイヤを離すときにホストオーダーに変換します。 –

答えて

3

まず、...すべての

b.v1 = ntohs(a->v1); 
b.v2 = ntohl(a->v2); 

第二には、答えは状況や患者モニタの仕様に依存します。誰が患者モニターのコードを書いていますか?その仕様はありますか?あなたが知っている場合は、どのモデルを使用していますか?あなたはただ1つのモデルを扱っていますか、それともモニターのバージョンが多いのですか?

Imあなたはできませんモニターを変更し、バイトオーダーがどこかで文書化されていること - は、バイトアドレス指定とビット操作を行うことによって独自のアンパック/パックルーチンを作成する必要があります。 「ネットワーク」の順序と一致し、構造体のパディングはネットワークバッファー内で同じです。

void unpack(struct *b, unsigned char *buffer) 
{ 
    b->v1 = (buffer[0] <<8)|(buffer[1]); 
   b->v2 = (buffer[2] <<24)|(buffer[3] <<16)|(buffer[4] <<8)|(buffer[5]); 
    etc.... 
}    

などが好きな場合はntohX、

void unpack(struct *b, unsigned char *buffer) 
{ 
    b->v1 = ntohs(buffer+0); 
   b->v2 = ntohl(buffer+2); 
    etc.... 
}    

しかしあなたがprotocol buffersのようなツールを使用して、モニターコード制御を行う場合はビット操作を行うためのすべての複雑さを取り除くと、バイトオーダー心配になるだろう....

+0

はい、返信ありがとうございます。私はインスタンス上のコードを少し間違えて書いた。 :)あなたが話している仕様の種類を説明できましたか? – Shivam

+0

患者モニタとのデータのレイアウト仕様は.... – Soren

+0

ありがとうございます。これは私の問題を解決しました。しかし、すべてのビット操作をハードコーディングするのではなく、バッファを自分の構造体にキャストし、構造体の個々の属性にntohsを使うことはできますか?また、上記のアプローチはホストコンピュータのエンディアンとは独立していますか? – Shivam

関連する問題