2009-12-02 10 views
5

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

プログラムは、C/C++で書かれており、somne​​oneはの形式でデータを交換するために、プロトコルバッファを使用するように私を助けることができれば、私は喜んでいるだろう:

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

私はいくつかの方法を試しましたが、データは正しく交換されていません。すべてのヘルプは非常にあなたの助けを

おかげでいただければ幸いです、

+6

このAny理由は、コミュニティのwikiですか? – Goz

答えて

11

あなたは.protoファイルにメッセージを定義することによって開始します。そして次にあなたがprotocを使用してコンパイル(私はfloat型とdoubleは、実際には異なる変数であり推測...)

package foo; 

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

をし、バッファを実装するコードがあります。詳細については

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

+0

返信ありがとうございます。例が示されている簡単なチュートリアルはありますか?もう一度ありがとうございます。 – make

+2

私が含まれているリンクに従ってください - これはC++のプロトコルバッファーを扱うチュートリアルです。 –

1

は、両方のマシンx86のか?それ以外の場合は、ビッグエンディアンとリトルエンディアンの違いを監視する必要があります。また、構造体のパッキングに注意を払う価値があります。ポインターを渡すことは、実際のポインターが異なるプラットフォーム上の異なるサイズであるためにも問題があります。あなたの投稿には、あまりにも多くの情報がありますが、何が間違っているのかは、具体的には言えません。

+0

マシンが異なっています。 UNIXはsun-bladeとx86のWindowsにインストールされています。しかし、私はプロトコルバッファが異なるマシンを扱うことを読んだので、これを使用することに決めました。 – make

0

答えは、送信されるデータのエンディアンにあります。これは非常に慎重に検討する必要があります。チェック。エンジニアリングが何をしてデータを受信者と送信者の両方で混乱させるかを示すにはhereを見てください。ユニックスボックスから送信されたデータが、ウィンドウボックスのデータがデータのメモリ構造に関して同じ順序になることを保証しているからといって、データをスムーズに転送するための完全な措置はありません。また、Unixボックス上の構造体のパディングは、Windowsボックス上のパディングとは異なります。コマンドラインスイッチの使い方に似ています。

+2

@ tommieb75:これは正しいですか?プロトコルバッファとエンディアンのためのグーグルでは、ソフトウェアがこれを正しく処理していることを示すGoogle Groupsの会話が表示されます。http://groups.google.com/group/protobuf/browse_thread/thread/5dbcc1c028f8c8bf – quamrana

+0

@quamrana googleのプロトコルバッファを知らない、その上に残念。あなたの構造体のパディングをチェックすると、コンパイラはそれをパディングして偶数のサイズにすることができます。あなたはそれが何であるかを見るために両端でsizeof(struct snd_data)を行うことによってそれを確認できますか?あなたがあなたの状況を説明するために何とか行くことができるよりも異なるサイズを取得する場合。 – t0mm13b

3

はどのようにソケットにあなたのメッセージを書いていますか? Protobufsはエンディアンには敏感ではありませんが、protobufsは転送メカニズムを定義していません - protobufはメッセージとそのシリアライズされたフォーム((8ビット)バイトのシーケンス)との間のマッピングを定義し、このバイト列をリモートホストに転送します。

ここでは、非常に単純なトランスポートプロトコルを定義します。最初に、メッセージサイズを32ビット整数(ビックエンディアン)として書き込み、次にメッセージ自体が出力されます。 (protobufメッセージは自己識別ではなく、送信するメッセージを知る必要があることに注意してください)これは、通常、送信するすべてのメッセージにオプションのフィールドを含むラッパーメッセージを持つことによって管理されます。このテクニックの詳細については、ウェブサイトとメーリングリストのアーカイブを参照してください。)

+0

はい。詳細については、[https://developers.google.com/protocol-buffers/docs/techniques#streaming](https://developers.google.com/protocol-buffers/docs/techniques#streaming)を参照してください。 Protobufは「自己区切りではない」 –

関連する問題