C ++谷歌协议缓冲区打开http套接字
那么有帮助的人:
这是另一个NEWBIE问题。 我是C ++,Google协议缓冲区的新手,通过HTTP序列化消息时没有使用SOAP(即使使用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(*发送器)是从仅包含ipAddress和端口号的.protoc文件生成的C ++类和头。 好的,所以我有一个ipaddress和一个端口的发射器。 怎么办? 我如何用它打开一个套接字?
也许一旦我打开一个套接字,其他答案会对我更有意义。 有人可以帮助解除我的混淆?
谢谢。
Protocol Buffers只是一个序列化工具。 它会将您的消息对象转换为字节,并将字节转换回消息对象。 该库不直接实现传输这些字节的方式。
如果你有一个原始套接字,你可以将它封装在FileInputStream
/ FileOutputStream
以从/读取/写入protobufs *。 由于protobufs不是自定义的,因此您需要将大小写为前缀,然后是数据,并在接收端正确解释它们。 请参阅我对这个问题的回答,以获取相关代码:Java中Protocol Buffers分隔的I / O函数是否存在C ++等价物?
另一种方法是使用ZeroMQ这样的高级传输库,它实现了发送和接收byte-blob消息。 使用protobufs对字节块进行编码/解码,然后将它们交给ZeroMQ进行传输。
*这适用于Unix,其中套接字是文件描述符。 在Windows中,它们不是,所以您需要直接使用send()
/ recv()
方式实现ZeroCopyInputStream
/ ZeroCopyOutputStream
,如果您使用CopyingInputStreamAdapter
/ CopyingOutputStreamAdaptor
,这并不难。