当我使用协议缓冲区时,我如何知道服务器端的ByteSize()

When I use protocol-buffers, how could I know ByteSize() on the server side?

本文关键字:服务器端 何知道 ByteSize 协议 缓冲区      更新时间:2023-10-16

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

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

不检查返回值是个好主意吗?

不!

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

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

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