7

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

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

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

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

谢谢你的帮助,

4

5 回答 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

于 2009-12-02T17:39:48.967 回答
3

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

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

于 2009-12-23T15:41:31.217 回答
3

Endianess 在 protobuf 中处理。

看:

https://groups.google.com/forum/?fromgroups#!topic/protobuf/XbzBwCj4yL8

Google 的 Protocol Buffer 在实践中处理浮点类型的跨平台程度如何?

于 2013-01-02T05:02:48.033 回答
1

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

于 2009-12-02T17:23:30.530 回答
0

答案在于正在传输的数据的字节顺序,这是您需要非常仔细考虑和检查的事情。看这里以显示字节序可以做什么,并导致数据在接收方和发送方上都搞砸了。没有这样完美的数据平滑传输措施,只是因为从unix盒子发送的数据保证了windows盒子上的数据在数据的内存结构方面是相同的顺序。此外,unix 盒子上结构的填充将与 windows 盒子上的填充不同,归结为如何使用命令行开关,考虑结构对齐。

于 2009-12-02T17:25:08.910 回答