質問

誰かが助けて、プロトコルバッファの使用方法を教えてください。実際、シミュレーション調査を実行するために、UNIX で実行されているプログラムと Windows で実行されている別のプログラムの間でソケットを介してデータを交換したいと考えています。

ソケットを使用してデータを交換するプログラムは C/C++ で書かれており、次の形式でデータを交換するためにプロトコル バッファーを使用できるように somne​​one が役に立ってくれれば嬉しいです。

struct snd_data{
    char *var="temp";
    int var1=1;
    float var2;
    double var2;
}

いくつかの方法を試しましたが、依然としてデータが正しく交換されません。助けていただければ幸いです

ご協力いただきありがとうございます、

役に立ちましたか?

解決

まず、.proto ファイルでメッセージを定義します。

package foo;

message snd_data {
  required string var= 1;
  required int32 var1 = 2;
  optional float var2 = 3;
  optional double var3 = 4;
}

(floatとdoubleは実際には別の変数だと思います...)

次に、それを使用してコンパイルします protoc そして、バッファを実装するコードが完成します。

詳細については、以下を参照してください。 http://code.google.com/apis/protocolbuffers/docs/cpptutorial.html

他のヒント

ソケットにメッセージをどのように書き込んでいますか?Protobufs 自体はエンディアンに依存しませんが、トランスポート メカニズムも定義しません。protobuf は、メッセージとそのシリアル化形式 ((8 ビット) バイトのシーケンス) の間のマッピングを定義します。 あなたの この一連のバイトをリモート ホストに転送する責任があります。

私たちのケースでは、非常に単純なトランスポート プロトコルを定義します。まずメッセージ サイズを 32 ビット整数 (ビッグ エンディアン) として書き込み、次にメッセージ自体を書き込みます。(protobuf メッセージは自己識別型ではないことにも注意してください。つまり、どのメッセージを送信しているのかを知る必要があります。これは通常、 ラッパーメッセージ 送信するすべてのメッセージのオプションのフィールドが含まれています。この手法の詳細については、protobuf の Web サイトとメーリング リストのアーカイブを参照してください。)

どちらのマシンも x86 ですか?それ以外の場合は、ビッグ エンディアンとリトル エンディアンの違いに注意する必要があります。構造体のパッキングにも注意を払う価値があります。ポインターの受け渡しは、プラットフォームごとにポインターのサイズが異なるため、問題が発生する可能性があります。あなたの投稿には情報が少なすぎて、何が問題なのかを明確に伝えることができません...

答えは、送信されるデータのエンディアン性にあります。これは非常に慎重に検討し、確認する必要があります。見て ここ エンディアンによって何が起こり、受信側と送信側の両方でデータが混乱する可能性があることを示します。UNIX ボックスから送信されたデータは、データのメモリ構造に関して Windows ボックス上のデータが同じ順序であることが保証されているからといって、データをスムーズに転送するためのこれほど完璧な手段はありません。また、UNIX ボックスの構造体のパディングは、Windows ボックスのパディングとは異なります。結局のところ、コマンド ライン スイッチの使用方法に依存し、構造体の位置合わせを考えてください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top