2009-12-02 113 views
5

可能有人请帮忙,告诉我如何使用协议缓冲区。实际上,我想通过在运行在unix上的程序和运行在windows上的anoother之间的套接字来交换数据,以便运行仿真研究。如何使用协议缓冲区?

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

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

我尝试了几种方法,但仍然没有正确交换数据。任何帮助将不胜感激

感谢您的帮助,

+6

任何原因,这是一个社会维基? – Goz 2009-12-02 17:26:05

回答

11

你开始通过在.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

+0

感谢您的回复。有没有简单的教程,其中的例子显示?再次感谢, – make 2009-12-02 17:56:14

+2

请按照我包含的链接 - 这是一个教程,涵盖了从C++使用协议缓冲区。 – 2009-12-02 23:36:31

1

这两台机器都是x86吗?否则,你需要注意大端和小端的区别。它也值得关注struct包装。由于事实指针在不同平台上的大小不同,传递指针也可能会产生问题。在所有中有你的帖子的信息太少了说了,肯定的,什么错误......

+0

机器是不同的。 Unix安装在x86上的sun-blade和windows上。但是,我读了协议缓冲区处理不同的机器,这就是为什么我决定使用它... – make 2009-12-02 17:54:28

0

答案就在传输数据的字节序,这是需要慎重考虑的东西,检查。查看here以显示可以做什么endianness并导致数据在接收者和发送者上都搞砸了。有顺利传输数据,只是因为从UNIX系统中发送的数据保证了在Windows中的数据将在同一顺序对数据存储结构方面没有这样完美的措施。此外,unix框上的结构的填充将不同于窗口框中的填充,它归结为命令行开关的使用方式,请考虑结构对齐。

+2

@ tommieb75:这是正确的吗?谷歌搜索协议缓冲区和endian显示一个Google网上论坛对话,指出该软件正确处理:http://groups.google.com/group/protobuf/browse_thread/thread/5dbcc1c028f8c8bf – quamrana 2009-12-02 22:04:01

+0

@quamrana:我无法回答,因为我做不知道谷歌的协议缓冲区,对不起那边。检查你的结构填充,编译器可以填充它使其成为一个均匀的大小。您可以通过在两端执行sizeof(struct snd_data)来检查它,看看它是什么?如果你有不同的尺寸可以解释你的情况。 – t0mm13b 2009-12-02 22:38:45

3

你怎么写你的信息插座上? Protobufs不是端敏感本身,但同样没有限定protobufs输送机构 - protobuf的限定消息及其序列化形式之间的映射(其为(8位)的序列字节),它是你的责任将这个字节序列传输到远程主机。

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

+0

是的。有关更多详细信息,请参阅[https://developers.google.com/protocol-buffers/docs/techniques#streaming](https://developers.google.com/protocol-buffers/docs/techniques#streaming)。 Protobuf“不是自我划定的。” – 2015-02-19 18:15:24