如何使用协议缓冲区?

时间:2009-12-02 17:19:14

标签: c++ c gcc visual-c++ protocol-buffers

有人可以帮忙告诉我如何使用协议缓冲区。实际上我想通过在unix上运行的程序和在windows上运行的另一个程序之间的套接字交换数据,以便运行模拟研究。

使用套接字交换数据的程序是用C / C ++编写的,如果somne​​one可以帮助我使用协议缓冲区以便以下列形式交换数据,我会很高兴:

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

我尝试了几种方法,但数据仍未正确交换。任何帮助将非常感激

感谢您的帮助,

5 个答案:

答案 0 :(得分:13)

首先在.proto文件中定义消息:

package foo;

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

(我猜浮动和双重实际上是不同的变量......)

然后使用protoc编译它,然后你有代码实现你的缓冲区。

有关详细信息,请参阅:http://code.google.com/apis/protocolbuffers/docs/cpptutorial.html

答案 1 :(得分:3)

您是如何将消息写入套接字的? Protobufs本身不是字节序敏感的,但protobufs也没有定义传输机制 - protobuf定义了消息和它的序列化形式(它是一个(8位)字节序列)之间的映射,它是你的< / strong>将此字节序列传输到远程主机的责任。

在我们的例子中,我们定义了一个非常简单的传输协议;首先我们将消息大小写为32位整数(大端),然后是消息本身。 (另请记住,protobuf消息不是自我识别的,这意味着您需要知道要发送的消息。这通常通过包含包装消息来管理,其中包含您想要的所有消息的可选字段有关此技术的更多信息,请参阅protobuf网站和邮件列表存档。)

答案 2 :(得分:2)

答案 3 :(得分:1)

两台机器都是x86吗?否则你需要注意big endian和little endian差异。它也值得关注结构包装。由于事实指针在不同平台上的大小不同,因此传递指针也会有问题。在你的帖子中,所有信息都太少,无法确定是什么问题......

答案 4 :(得分:0)

答案在于传输数据的结尾,这是您需要非常仔细考虑并检查的内容。查看here以显示字节序可以执行的操作,并导致数据在接收方和发送方上混乱。没有这种平滑传输数据的完美措施,只是因为从unix盒发送的数据保证了windows盒上的数据在数据的内存结构方面将处于相同的顺序。 unix盒子上的结构填充也与windows盒子上的填充不同,它归结为命令行开关的使用方式,认为结构对齐。