0

UDPソケットを介して送信されるメッセージがあります。メッセージのタイプはRPCMessageです。

typedef struct
{
    enum {Request, Reply} messageType;
    unsigned int RPCId;
    unsigned int procedure;
    int arg1;
    int arg2;
} RPCMessage;

メッセージを送信する準備をしているときに、次のようにメッセージを作成します。

RPCMessage toSend = {RPCMessage::Reply, htonl(rpcId), htonl(procedureId), htonl(int1), htonl(int2);

メッセージを受信すると、char[]に受信されます。バッファを呼び出します。バッファ全体をRPCMessageにキャストするだけでなく、バ​​ッファから各引数を1つずつ読み取り、最初の引数を正しい列挙型として使用し、ntohlを使用する方がよいことが提案されています。お互いの議論。これを行うための最良の方法は、次のようなものでしょうか。

RPCMessage::messageType type;
unsigned int id, procedure;
int int1, int2;
sscanf(buffer, %d%d%d%d%d, type, id, procedure, int1, int2);
RPCMessage received = {type, ntohl(id), ntohl(procedure), ntohl(int1), ntohl(int2));

または別の/より良い方法はありますか?

4

2 に答える 2

0

最良の方法は、ブーストシリアル化のような堅牢なシリアル化フレームワークを使用することです。

http://www.boost.org/doc/libs/1_51_0/libs/serialization/doc/index.html

それはあなたのメッセージがどれほど複雑になることができるかに依存します。

于 2012-10-14T03:02:48.197 に答える
0

構造体にキャストすることをお勧めします。主な理由-パフォーマンス。

ほとんどの場合、構造体のレイアウトとバッファ内のデータの間でバイナリ互換性を実現できます。パディングやアラインメントなどを制御するプラグマがあります。C++には、そのための特別なアラインメント仕様があります。

言いたくないjust cast and problems will disappear。それでもバイトオーダーを処理する必要があり、文字reprは異なる場合があります。

構造体の表現を変えたい場合や、構造体のツリーのようにデータ構造が複雑な場合は、シリアル化を使用する必要があります。

于 2012-10-14T03:08:55.880 に答える