2015-01-21 55 views
0

消息格式消息以發送到如下服務器側:序列化和反序列化使用谷歌的protobuf在用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. 如何使用谷歌協議緩衝區在上面留言 客戶端
  2. ,這樣我可以看到解碼/打印信息。
+0

你真的需要'AppendToString()'嗎?你是否將'original'消息附加到任何其他消息?如果沒有,爲什麼不考慮只是'SerializeToString()'?我只是好奇。 (*) – ALittleDiff 2015-01-21 06:50:08

回答

1

您應該發送的不僅僅是protobuf消息,以便能夠在客戶端對其進行解碼。

一個簡單的解決方案是使用網絡字節順序將套接字上的buffer.size()作爲4字節整數發送,併發送緩衝區本身。

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

有關protobuf消息方法的更多信息,請參閱here

此外,this文件鼓勵的required用法:

你應該非常小心,因爲需要打標領域。如果在 某處您希望停止寫入或發送必填字段,那麼 將將字段更改爲可選字段會有問題 - 舊的 讀者會認爲沒有此字段的郵件不完整,並且 可能會無意中拒絕或丟棄它們。您應該考慮爲您的緩衝區 改寫應用程序特定的自定義驗證例程 。谷歌的一些工程師得出結論認爲, 使用所需要的弊大於利;他們更喜歡只使用 可選和重複。但是,這種觀點並不普遍。

+0

我只能使用以下代碼打印無法打印名稱的ID: – 2015-01-21 07:41:55

+0

您可能想要使用pastebin來共享代碼。評論並不是那麼好。只需在評論中發佈pastebin鏈接即可。 – nicebyte 2015-01-21 07:44:07

+0

該怎麼辦? – 2015-01-21 07:45:36

相關問題