如何使用协议缓冲(Protocol Buffers)?

7

请问有人能帮我告诉我如何使用协议缓冲区吗?实际上,我想通过套接字在运行在Unix和Windows上的程序之间交换数据,以进行模拟研究。

使用套接字交换数据的程序是用C / C ++编写的。如果有人能帮助我使用协议缓冲区来交换数据,我会很高兴的。交换的数据格式如下:

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

我尝试了几种方法,但数据仍然没有正确交换。非常感谢您的帮助。
谢谢。

6
为什么这是一个社区维基? - Goz
5个回答

13

你可以通过在.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


谢谢您的回复。有没有一个简单的教程,可以展示一个例子?再次感谢。 - make
2
请跟随我提供的链接 - 这是一个涵盖了如何在C++中使用协议缓冲区的教程。 - Douglas Leeder

3
你是怎么将消息写到套接字中的?Protobufs 本身并不敏感于大小端,但它也没有定义传输机制。Protobufs 定义了消息和其序列化形式(即一系列(8位)字节)之间的映射,将这一系列字节传输给远程主机是你的责任。
在我们的情况下,我们定义了一个非常简单的传输协议;首先,我们将消息大小作为 32 位整数(大端)进行写入,然后是消息本身。(还要记住,protobuf 消息不是自我识别的,这意味着你需要知道你正在发送哪个消息。这通常通过包含所有要发送消息的可选字段的包装器消息来管理。请参阅 protobuf 网站和邮件列表档案以获取有关此技术的更多信息。)

是的。更多细节请参见https://developers.google.com/protocol-buffers/docs/techniques#streaming。Protobuf“不是自限定的”。 - Chris Jones


1

这两台机器都是x86吗?否则,您需要注意大端和小端的差异。同时,值得注意的是结构体打包。由于不同平台上指针的大小不同,因此传递指针也可能会出现问题。总之,在您的帖子中提供的信息太少了,无法确定出现了什么问题...


机器不同。Sun-Blade上安装了Unix,而x86上安装了Windows。但是,我读到协议缓冲区可以处理不同的机器,这就是为什么我决定使用它的原因... - make

0
答案在于传输的数据的字节序,这是您需要非常仔细考虑和检查的事情。点击这里以展示字节序可能会导致数据在接收方和发送方都出现混乱。并没有一种完美的方法可以顺畅地传输数据,仅仅因为从Unix系统发送的数据保证了Windows系统上的数据将按照内存结构的相同顺序排列。此外,在Unix系统上的结构填充与Windows系统上的填充不同,这归结于如何使用命令行开关,考虑结构对齐。

2
@tommieb75:这正确吗?在Google上搜索协议缓冲区和字节序,显示了一个Google Groups的对话,表明该软件可以正确处理此问题:http://groups.google.com/group/protobuf/browse_thread/thread/5dbcc1c028f8c8bf - quamrana
@quamrana:很抱歉,我不了解Google的协议缓冲区,所以无法回答您的问题。请检查您的结构填充,编译器可能会将其填充为偶数大小。您可以通过在两端执行sizeof(struct snd_data)来检查它是什么?如果您得到不同的大小,那么这可能在某种程度上解释您的情况。 - t0mm13b

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接