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

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

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

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

感谢您的帮助,

有帮助吗?

解决方案

首先在 .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

其他提示

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top