C ++ Google Protocol Buffers打开http套接字

时间:2014-04-24 21:44:39

标签: c++ sockets protocol-buffers

非常有帮助的人:

这是另一个NEWBIE问题。我是C ++,Google Protocol Buffers的新手,并且在没有SOAP的情况下通过HTTP序列化消息(即使使用SOAP)。我试图通过http发送图像数据。有人告诉我,谷歌协议缓冲区是可行的方法。所以我急切地开始浏览所有文档,并使用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(* transmit)是从.protoc文件生成的C ++类和头文件,只包含ipAddress和端口号。好的,所以我有一个带有ipaddress和端口的发射器。怎么办?如何用它打开插座?

也许一旦我打开套接字,其他答案对我来说会更有意义。有人可以帮忙让我不相信吗?

谢谢。

1 个答案:

答案 0 :(得分:4)

协议缓冲区只是一个序列化工具。它会将您的消息对象转换为字节,并将字节转换回消息对象。该库不直接实现传输这些字节的方法。

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

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

*这适用于Unix,其中套接字是文件描述符。在Windows上,它们不是,所以您需要直接以ZeroCopyInputStream / ZeroCopyOutputStream来实现send() / recv(),这不是如果你使用CopyingInputStreamAdapter/CopyingOutputStreamAdaptor,那就太难了。