2015-08-22 19 views
1

根據協議緩衝區api,如果格式錯誤,ParseFromArray(const void * data, int size)將失敗,在我的情況下,當size參數不正確時返回false。很多回答指出,在使用SerializeToArray(void * data, int size)時應該使用ByteSize(),並且確保解析正確的大小,但是沒有一個明確指出。那麼如何將ByteSize()值傳遞給服務器端以確保ParseFromArray不返回false?當我使用協議緩衝區時,如何知道服務器端的ByteSize()?

據我所知,我發現的所有例子都使size參數成爲接收緩衝區的全部大小,並且根本沒有檢查返回值,因爲字段將以任何方式解析。這是一個好主意,不要選中返回值嗎?

+0

協議緩衝區格式不是自行分隔的。這是由一個更高層次的協議來決定一個protobuf結束和另一個開始的地方。由您來定義所述更高級別的協議。 –

回答

1

這是一個好主意,讓返回值不被選中?

不!

你從哪裏得到數據緩衝區?無論你在哪裏,都應該告訴你緩衝區中有多少字節。

例如,如果使用recv()從網絡接收UDP數據報,它將返回接收到的字節數。

如果您使用的是TCP,那麼recv()會再次返回收到的字節數,但請注意,該消息可能會以多個部分到達。您需要一些方法來了解何時完成,例如通過使用shutdown()在發送消息之後結束數據流,或者在消息之前單獨寫入大小。對於後一種解決方案,您可能對我的pull request感興趣,它可以幫助protobufs完成此任務(但也不難做到)。

+0

你開導我。我可以使用recvfrom()的返回值。 – reavenisadesk