mul*_*lle 13 c++ sockets message protocol-buffers
我正在使用protobuf序列化我通过C++中的套接字连接发送的消息.对于通信,我想在消息标记中添加标题,指示消息的长度.您对此实施有何看法?我做了一些研究,这就是我放在一起的东西.
有没有更好的方法来做到这一点?这种实施能否造成任何麻烦?我知道Java有API支持,但遗憾的是不支持C++.
bool send_message(int socket, my_protobuf::Message message)
{
google::protobuf::uint32 message_length = message.ByteSize();
int prefix_length = sizeof(message_length);
int buffer_length = prefix_length + message_length;
google::protobuf::uint8 buffer[buffer_length];
google::protobuf::io::ArrayOutputStream array_output(buffer, buffer_length);
google::protobuf::io::CodedOutputStream coded_output(&array_output);
coded_output.WriteLittleEndian32(message_length);
message.SerializeToCodedStream(&coded_output);
int sent_bytes = write(socket, buffer, buffer_length);
if (sent_bytes != buffer_length) {
return false;
}
return true;
}
bool recv_message(int socket, my_protobuf::Message *message)
{
google::protobuf::uint32 message_length;
int prefix_length = sizeof(message_length);
google::protobuf::uint8 prefix[prefix_length];
if (prefix_length != read(socket, prefix, prefix_length)) {
return false;
}
google::protobuf::io::CodedInputStream::ReadLittleEndian32FromArray(prefix,
&message_length);
google::protobuf::uint8 buffer[message_length];
if (message_length != read(socket, buffer, message_length)) {
return false;
}
google::protobuf::io::ArrayInputStream array_input(buffer, message_length);
google::protobuf::io::CodedInputStream coded_input(&array_input);
if (!message->ParseFromCodedStream(&coded_input)) {
return false;
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
使用varint(例如WriteVarint32)而不是fixed32(你所拥有的WriteLittleEndian32)更常见,但是通过前缀长度来划分protobuf流的做法是合理的.
| 归档时间: |
|
| 查看次数: |
4746 次 |
| 最近记录: |