非常有帮助的人:
这是另一个新手问题。我是 C++、Google Protocol Buffers 和在没有 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++ 类和 header 。好的,所以我有这个带有 IP 地址和端口的发射器。怎么办?我如何用它打开套接字?
也许一旦我打开一个套接字,其他答案对我来说会更有意义。有人可以帮我解惑吗?
谢谢。
最佳答案
Protocol Buffers 只是一个序列化工具。它会将您的消息对象转换为字节,并将字节转换回消息对象。该库不直接实现传输这些字节的方法。
如果你有一个原始套接字,你可以将它包装在 FileInputStream
/FileOutputStream
中从/向它读取/写入 protobufs*。由于 protobufs 不是自定界的,您需要将大小写为前缀,然后是数据,并在接收端正确解释这些。请参阅我对其他问题的回答以获取执行此操作的代码:Are there C++ equivalents for the Protocol Buffers delimited I/O functions in Java?
另一种选择是使用更高级的传输库,如 ZeroMQ,它实现字节 blob 消息的发送和接收。使用 protobufs 编码/解码字节 blob,然后将它们交给 ZeroMQ 进行传输。
* 这适用于 Unix,其中套接字是文件描述符。在 Windows 上,它们不是,因此您需要根据 send()
/ 直接实现
,如果你使用 ZeroCopyInputStream
/ZeroCopyOutputStream
>recv()CopyingInputStreamAdapter
/CopyingOutputStreamAdaptor
并不难.
关于C++ Google Protocol Buffer 打开 http 套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23280457/