簡體   English   中英

在C ++套接字編程中使用google protobuf序列化和反序列化消息

[英]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);

通過此發送功能,它將數據發送到客戶端,希望並且對於此特定代碼,我也不會收到任何錯誤。

但我的擔心如下:

  1. 如何在客戶端使用Google協議緩沖區對上述消息進行解碼
  2. 這樣我就可以看到/打印消息。

您不僅應該發送protobuf消息,還可以在客戶端對其進行解碼。

一種簡單的解決方案是使用網絡字節順序在套接字buffer.size()的值作為4字節整數發送,然后發送緩沖區本身。

客戶端應首先從套接字讀取緩沖區的大小,然后將其從網絡轉換為主機字節順序。 讓我們表示結果值s 然后,客戶端必須預分配大小為s的緩沖區,並從套接字向其中讀取s個字節。 之后,只需使用MessageLite :: ParseFromString來重構您的protobuf。

有關protobuf消息方法的更多信息,請參見此處

另外, 文檔不鼓勵使用required

您在標記所需字段時應格外小心。 如果您希望停止寫入或發送必填字段,則將該字段更改為可選字段會很成問題–老讀者會認為沒有該字段的郵件是不完整的,可能會無意中拒絕或丟棄它們。 您應該考慮為緩沖區編寫特定於應用程序的自定義驗證例程。 Google的一些工程師得出的結論是,使用必需的弊大於利。 他們更喜歡只使用可選的和重復的。 但是,這種觀點並不普遍。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM