当我使用协议缓冲区时,我怎么能知道服务器端的ByteSize()?

时间:2015-08-22 13:58:06

标签: c++ protocol-buffers

根据protocol-buffers api,如果格式错误,ParseFromArray(const void * data, int size)将失败,在我的情况下,当size参数不正确时,它返回false。很多答案指出在使用ByteSize()时应该使用SerializeToArray(void * data, int size),并确保解析正确的大小,但没有一个明确指出如何。那么如何将ByteSize()值传递给服务器端以确保ParseFromArray不返回false?

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

1 个答案:

答案 0 :(得分:1)

  

这是一个好主意,不会检查返回值吗?

没有!

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

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

如果您使用的是TCP,则recv()会再次返回收到的字节数,但请注意该消息可能会以多个部分到达。您需要一些方法来了解它何时完成,例如在发送消息后使用shutdown()结束流,或者在消息之前单独写入大小。对于后一种解决方案,您可能会对我的pull request感兴趣,它会为protobufs添加帮助程序来完成此任务(但是,自己也不难做到)。