C++中protobuf消息的长度前缀
Length prefix for protobuf messages in C++
我正在使用protobuf序列化通过C++中的套接字连接发送的消息。对于通信,我想在消息包中添加一个标头,指示消息的长度。你对这个实现有什么看法?我做了一些研究,这就是我所做的。
有更好的方法吗?这种实现会引起任何麻烦吗?我知道API支持Java,但遗憾的是不支持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;
}
使用variant(例如WriteVarint32
)而不是fixed32(在有WriteLittleEndian32
的情况下)更为常见,但通过前缀长度来界定protobuf流的做法是合理的。
相关文章:
- boost::进程间消息队列引发错误
- 在线编译器中的分段C++没有打印消息
- C++错误消息*成员参考.**初学者*
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 如何通过参数抛出错误消息
- 从服务器传输到客户端的消息不会出现
- ROS2 动态消息模板
- C++秘密消息学校作业
- glad 导致 glfwSwapBuffers 返回错误消息
- C++入门 5 版:类消息和文件夹
- FindPackageHandleStandardArgs.cmake:137 的 CMake 错误(消息):找不到 Boost (缺少:正则表达式)(找到合适的版本"1.72.0",
- 编译器如何在前缀和 postix 运算符之间进行区分?
- 如何处理从一个对象传递到另一个在C++中具有公共抽象类的对象的消息
- 如何接受 [ENTER] 键作为无效输入并发送错误消息
- 由于无效的 ValidateRgn() 子窗口不会收到WM_PAINT消息
- "string.h"在构建适用于iOS的qt应用程序中找不到消息
- Tcp 协议前缀消息的长度
- C++中protobuf消息的长度前缀
- 是否可以使用 Varint32 大小前缀的协议缓冲区消息实现类似"FileInputStream::BackUp()"的功能?