【问题标题】:C++ Google Protocol Buffers open http socketC++ Google 协议缓冲区打开 http 套接字
【发布时间】:2014-04-24 21:44:38
【问题描述】:

非常有帮助的人:

这是另一个新手问题。我是 C++、Google 协议缓冲区和不使用 SOAP 的 HTTP 序列化消息的新手(即使使用 SOAP 也是如此)。我正在尝试通过 http 发送图像数据。有人告诉我 Google Protocol Buffers 是要走的路。因此,我急切地开始阅读所有文档,并使用 CocoaPods 安装 Google Protocol Buffer 类并将其包含到我的项目中。我创建了我的 .protoc 文件并生成了类。现在我正在使用生成的类填充数据。现在呢???

我找不到有关如何发送数据的任何信息。我发现了一些关于 SO 的其他问题,如果我有线索的话,这些问题可能是有意义的信息。这是我目前所拥有的:

void message::myMessage::transmit(const uint32_t ipaddress, uint32_t port, message::MatMessage* rawImage)
{
    message::HostMessage *transmitter;
    transmitter->set_ipaddress(ipaddress);
    transmitter->set_port(port);

    //open socket with ip and port

    //send unsing socket

}

HostMessage (*transmitter) 是从仅包含 ipAddress 和端口号的 .protoc 文件生成的 C++ 类和标头。好的,所以我有这个带有 ipaddress 和端口的发射器。怎么办?我如何用它打开一个套接字?

也许一旦我打开一个套接字,其他答案对我来说会更有意义。有人可以帮我解惑吗?

谢谢。

【问题讨论】:

  • 您需要自己编写套接字代码,协议缓冲区并没有提供太多帮助。为您的平台读取套接字,创建/连接端点,序列化协议缓冲区消息(例如使用 ArrayInputStream 和 CodedInputStream 或 SerializeToString),写入数据包长度,然后写入数据,在接收端读取数据包长度,然后读取数据,并反序列化数据(ParseFromCodedStream)。通过一些搜索,您会在这里和那里找到一些经历序列化/反序列化过程的示例。

标签: c++ sockets protocol-buffers


【解决方案1】:

Protocol Buffers 只是一个序列化工具。它将您的消息对象转换为字节,并将字节转换回消息对象。该库没有直接实现传输这些字节的方法。

如果你有一个原始套接字,你可以将它包装在FileInputStream/FileOutputStream 中,以便从/向它读取/写入 protobufs*。由于 protobuf 不是自定界的,因此您需要将大小写为前缀,然后是数据,并在接收端正确解释这些内容。有关执行此操作的代码,请参阅我对其他问题的回答:Are there C++ equivalents for the Protocol Buffers delimited I/O functions in Java?

另一种选择是使用更高级别的传输库,例如 ZeroMQ,它实现了字节块消息的发送和接收。使用 protobufs 对字节 blob 进行编码/解码,然后将它们交给 ZeroMQ 进行传输。

* 这适用于 Unix,其中套接字是文件描述符。在 Windows 上,它们不是,因此您需要直接按照 send()/recv() 实现 ZeroCopyInputStream/ZeroCopyOutputStream,如果您使用 CopyingInputStreamAdapter/CopyingOutputStreamAdaptor,这并不难。

【讨论】:

    猜你喜欢
    • 2010-11-28
    • 2023-03-29
    • 1970-01-01
    • 2011-04-23
    • 1970-01-01
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多