c++ - 当我使用 Protocol Buffer 时,我怎么知道服务器端的 ByteSize()?

标签 c++ protocol-buffers

根据 Protocol Buffer api,如果格式错误,ParseFromArray(const void * data, int size) 将失败,在我的例子中,当 size 参数不对。很多回答都指出在使用SerializeToArray(void * data, int size)时应该使用ByteSize(),并确保解析正确的大小,但是都没有他们清楚地指出了如何。那么如何将 ByteSize() 值传递到服务器端以确保 ParseFromArray 不返回 false?

据我所知,我找到的所有示例都使 size 参数成为接收缓冲区的完整大小,并且根本不检查返回值,因为字段将解析任何方式。不检查返回值是个好主意吗?

最佳答案

Is this a good idea leaving the return value unchecked?

不!

你从哪里得到数据缓冲区?无论你从哪里得到它,都应该告诉你缓冲区中有多少字节。

例如,如果您使用 recv() 从网络接收 UDP 数据报,它会返回接收到的字节数。

如果您使用的是 TCP,则 recv() 会返回接收到的字节数,但请注意消息可能会分多个部分到达。您需要通过某种方式知道何时完成,例如在消息发送后使用 shutdown() 结束流,或者在消息前单独写入大小。对于后一种解决方案,您可能对我的 pull request 感兴趣,它将帮助器添加到 protobufs 以实现此目的(但你自己也不太难)。

关于c++ - 当我使用 Protocol Buffer 时,我怎么知道服务器端的 ByteSize()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32156955/

相关文章:

c++ - 为什么在包含 WinSock2.h 时会出现大量编译器错误?

c++ - 模板类继承语法

c++ - 我可以在低级 Hook 过程中区分触摸板和鼠标消息吗? (Win32)

c++ - 预序列化原始消息的某些字段

c - 使用 ZeroMQ 和 ProtocolBuffers 发送结构

c++ - 代数数据类型的惯用现代 C++ 是什么?

c++ - 错误 : iostream: No such file or directory

go - JSON 对我来说比 Protobuf/gRPC 快得多,Go 作为服务器,PHP 作为客户端

iphone - iOS 5、Xcode 4.2 和 ProtoBuf

go - 未定义 : proto. ProtoPackageIsVersion3