2012-03-25 10 views
0

私は、コネクションレス(UDP)ソケットを使用して特定の患者モニターと通信するためのプログラムを作成しています。私は、患者モニターから受信したデータを解析するために使用すべき最も高速で効率的なアルゴリズムの提案が必要です。Cでのソケットプログラミングとレスポンスのシリアル化解除

患者モニタは、構造体の定義は以下の通りです、のAttributeList構造としてデータを送信します -

typedef struct { 
    uint16 count; 
    uint16 length; 
    AVAType * values; 
} AttributeList; 

typdef struct { 
    uint16 id; 
    uint16 length; 
    void * data; 
} AVAType 

そうのAttributeListが多くAVAType構造を含む、すべてのAVAType構造がvoidポインタとしてidとデータが含まれています(データがありますAVATypeの実際のデータのプレースホルダー)。実際、AVATypeと各IDに対して約150のIDが定義されているため、解析目的でデータを対応するデータ構造に配置する必要があります。

AVAType構造におけるIDが1であれば、そのデータは、アルゴリズムAを使用して解析されなければならないが、IDが2の場合、データはアルゴリズムBを使用して解析されなければならないなど...

私の現在のアプローチは、150を使用していますif-elseステートメントを実行し、AVATypeの特定のデータ構造体をロードして、結果を解析します。また、患者モニターはネットワーク経由でデータを送信し、IDごとにAVATypeを展開する必要があります。

このような状況に対処するには、適切な方法をお勧めします。それはちょうど大学のことです、私は安全性についてはあまり兄弟ではない、私は安全性が徐々に向上することができると思うが、今はスピードの私の懸念。

はい、それはactAully AVAType値[];です。これがなぜAVAType *と違うのか、より具体的に言えますか?私の構造を他の方法で定義するとどんなに役立つことができますか?

+0

ハッシュマップを作成できます。ここで、keyはIDで、値は関数ポインタです。この方法では、if-else構造は必要ありませんが、ハッシュテーブルからアルゴリズムの関数を取得できます。編集:gbulmer言ったように、関数ポインタの配列がより合理的です。 – Timo

+0

患者モニタを扱う際には、スピードよりも信頼性と安全性に重点を置くべきですか? –

+0

メモリが限られている組み込みシステムで作業している場合を除き、配列を使用することをお勧めします。デバッグするのは簡単で、非常に予測可能です。 idはわずか16bitsしかありません。これはかなりの量の店舗です。実行時には非常に予測可能ですが、 'fun_ptr [id](...)'です。それは簡単なので、自動的にそれらをすべてテストする機能を追加し、そのデータと呼び出しが一致していることを確認してください。 – gbulmer

答えて

8

関数に整数からマップする通常の方法は、IDが1バイトのみの場合は(それが制限することができた場合)、私はすべての256をマップしたい関数ポインタの配列だけ

typedef void (*Fun_ptr)(int id, void *current_byte); 

Fun_ptr fun_ptr[0xFFFF+1] = { funcA, funcB, ...}; 

です。

すべての16ビットIDであっても、大量のストレージではありません。

私は「エラーキャッチ」機能で未使用のIDを指摘したいと思います。

用途:

next_buffer_position = fun_ptr[id](id, current_buffer_position); 

は次に、関数は、それが書くのはerror_catch機能を容易にする、のために呼び出されたIDを知っている、あなただけの1を必要としています。


あなたはそれがAVAType * values;void * data;ですか?
valuesまたはdataはパケット内のオフセットであるはずですか?
不可能ではなく、正しいかもしれません。現在、AVATypeとAttributeListは固定サイズです。

フィールドAVAType * values;void * data;は、ポインタの受信側コンピュータのサイズです。これは何でもかまいませんが、おそらく32ビット、つまり64ビットです。ソフトウェアを別のマシンに移動すると、それは潜在的な問題であり、なぜ私が求めているのですか。彼らはデータを保持しません、彼らはデータへのポインタですが、彼らのサイズは受信側のマシンによって異なります。疑わしい。彼らが定義されているサイズを再確認してください。

ネットワークプロトコルでパケットを処理する一般的な方法は、空の配列を構造体の最後のフィールドとして使用します。そのアプローチでは

typdef struct { 
    uint16 id; 
    uint16 length; 
    unsigned char data[]; 
} AVAType; 

、そこパケットの開始近くの固定された位置のパケット長は、通常、それは、パケットの残りの実際の大きさを与えます。したがって、プロトコルはパケット全体またはdata[]が長さバイトかどうかを定義します。ちょっとハッキリですが使いやすいです。 (NB IIRC unsigned char data[];はC++ではありません)

要約:メモリ内の構造体は、あなたが示したtypedefである可能性がありますが、on-the-wireプロトコルは可変サイズポインタ。

+0

こんにちは、お返事ありがとうございます。 AVAType []とAVAType *はどう違っているのですか?もし私が自分の構造をそのように定義するなら、それはどんな方法でも役立つでしょうか? – Shivam

関連する問題