プロトコルバッファの使い方は?
-
11-09-2019 - |
質問
誰かが助けて、プロトコルバッファの使用方法を教えてください。実際、シミュレーション調査を実行するために、UNIX で実行されているプログラムと Windows で実行されている別のプログラムの間でソケットを介してデータを交換したいと考えています。
ソケットを使用してデータを交換するプログラムは C/C++ で書かれており、次の形式でデータを交換するためにプロトコル バッファーを使用できるように somneone が役に立ってくれれば嬉しいです。
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 サイトとメーリング リストのアーカイブを参照してください。)
エンディアンネスは protobuf 内で処理されます。
見る:
https://groups.google.com/forum/?fromgroups#!topic/protobuf/XbzBwCj4yL8
どちらのマシンも x86 ですか?それ以外の場合は、ビッグ エンディアンとリトル エンディアンの違いに注意する必要があります。構造体のパッキングにも注意を払う価値があります。ポインターの受け渡しは、プラットフォームごとにポインターのサイズが異なるため、問題が発生する可能性があります。あなたの投稿には情報が少なすぎて、何が問題なのかを明確に伝えることができません...
答えは、送信されるデータのエンディアン性にあります。これは非常に慎重に検討し、確認する必要があります。見て ここ エンディアンによって何が起こり、受信側と送信側の両方でデータが混乱する可能性があることを示します。UNIX ボックスから送信されたデータは、データのメモリ構造に関して Windows ボックス上のデータが同じ順序であることが保証されているからといって、データをスムーズに転送するためのこれほど完璧な手段はありません。また、UNIX ボックスの構造体のパディングは、Windows ボックスのパディングとは異なります。結局のところ、コマンド ライン スイッチの使用方法に依存し、構造体の位置合わせを考えてください。