[英]Serialize and deserialize the message using google protobuf in socket programming in C++
發送到服務器端的消息格式如下:
package test;
message Test {
required int32 id = 1;
required string name = 2;
}
Server.cpp做編碼:字符串緩沖區;
test::Test original;
original.set_id(0);
original.set_name("original");
original.AppendToString(&buffer);
send(acceptfd,buffer.c_str(), buffer.size(),0);
通過此發送功能,它將數據發送到客戶端,希望並且對於此特定代碼,我也不會收到任何錯誤。
但我的擔心如下:
您不僅應該發送protobuf消息,還可以在客戶端對其進行解碼。
一種簡單的解決方案是使用網絡字節順序在套接字buffer.size()
的值作為4字節整數發送,然后發送緩沖區本身。
客戶端應首先從套接字讀取緩沖區的大小,然后將其從網絡轉換為主機字節順序。 讓我們表示結果值s
。 然后,客戶端必須預分配大小為s
的緩沖區,並從套接字向其中讀取s
個字節。 之后,只需使用MessageLite :: ParseFromString來重構您的protobuf。
有關protobuf消息方法的更多信息,請參見此處 。
另外, 本文檔不鼓勵使用required
:
您在標記所需字段時應格外小心。 如果您希望停止寫入或發送必填字段,則將該字段更改為可選字段會很成問題–老讀者會認為沒有該字段的郵件是不完整的,可能會無意中拒絕或丟棄它們。 您應該考慮為緩沖區編寫特定於應用程序的自定義驗證例程。 Google的一些工程師得出的結論是,使用必需的弊大於利。 他們更喜歡只使用可選的和重復的。 但是,這種觀點並不普遍。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.