根据protocol-buffers api,如果格式错误,ParseFromArray(const void * data, int size)
将失败,在我的情况下,当size
参数不正确时,它返回false。很多答案指出在使用ByteSize()
时应该使用SerializeToArray(void * data, int size)
,并确保解析正确的大小,但没有一个明确指出如何。那么如何将ByteSize()
值传递给服务器端以确保ParseFromArray不返回false?
据我所知,我发现的所有示例都使size
参数成为接收缓冲区的完整大小,并且根本没有检查返回值,因为字段将以任何方式解析。这是一个好主意,不会检查返回值吗?
答案 0 :(得分:1)
这是一个好主意,不会检查返回值吗?
没有!
你从哪里获得数据缓冲区?无论你得到它,都应该告诉你缓冲区中有多少字节。
例如,如果您使用recv()
从网络接收UDP数据报,它将返回接收的字节数。
如果您使用的是TCP,则recv()
会再次返回收到的字节数,但请注意该消息可能会以多个部分到达。您需要一些方法来了解它何时完成,例如在发送消息后使用shutdown()
结束流,或者在消息之前单独写入大小。对于后一种解决方案,您可能会对我的pull request感兴趣,它会为protobufs添加帮助程序来完成此任务(但是,自己也不难做到)。