2010-01-21 72 views
1

我需要在C++中實現一個簡單的網絡上的交互,我一直在想是否有庫已經這樣做。我的協議基本上發送消息並接收響應。每條消息只是一組基本數據類型的3-4個值。我想找到一個可以執行下列一項或多項操作的庫(或多個庫):尋找一個簡單的協議實現庫

  1. 將值序列化爲高效的字節數組(我無法使用基於文本的序列化)。
  2. 發送消息並等待結果(它可以鎖定或異步接收響應,我不在乎)。
  3. 它必須能夠關聯發送的消息和響應。

理想我想能寫這樣的事:那cool_library ::發送返回true時沒有成功發送的消息,但

// On the sending side 
bool send(const string& str, int x, char y) 
{ 
    Message msg; 
    msg << str << x << y; 

    // Lock until the response arrives 
    return cool_library::send(address, msg); 
} 

// On the receiving side 
bool receive(Message& msg) 
{ 
    string str; 
    int x; 
    char y; 

    msg >> str; 
    msg >> x; 
    msg >> y; 

    if (some conditions...) 
     return true; // the message was handled successfully 
    else 
     return false; 
} 

時候要注意對方的反應與成功結果。所有這些冗長的解釋只是爲了表明我需要一個簡單的功能。沒有什麼花哨。我甚至可以自己發送和接收緩衝區,但我需要一些可以將消息與響應關聯的東西。我不想去參加RPC,因爲在我看來這是一種矯枉過正的行爲。

謝謝。

回答

2

Google protocolbuffers。我一直在使用它,它是快速,可擴展和相當輕量級的。

這是一個考慮時間/網絡優化的二進制序列化。

它實際上不支持通過套接字「發送」,但如果您只是發送一個帶有消息大小的整數然後發送消息,那麼它非常簡單。這樣在另一側讀取一個整數並知道傳入消息的大小,以便正確地調用parseFromArray

+0

確實看起來像一個很好的序列化解決方案。但是你知道一些可以爲我管理消息生命週期的東西嗎?諸如消息響應,重試可能? – FireAphis 2010-01-21 11:57:08

+0

另外,您如何看待boost序列化庫? – FireAphis 2010-01-21 11:58:03

+0

從未使用過boost序列化,但是如果你想要一些處理網絡資料並增加更多可靠性(通過TCP)的東西,它不會那麼便宜,也許你應該尋找更完整的框架。 – 2010-01-21 12:08:28

1

轉到Google的協議緩衝區庫。它最大限度地減少了發送的數據,並自動生成從聲明文件自動序列化和反序列化的cpp文件。它也可以向後兼容,因爲您可以發佈協議的新版本!

http://code.google.com/p/protobuf/

+1

它是二進制的,而不是文本 – 2010-01-21 11:40:49

+0

好吧,我剛剛檢查過,確實可以選擇文本和二進制文件,所以,這是爲了序列化。響應? – FireAphis 2010-01-21 11:46:28

+1

當你定義你的協議時,你可以定義響應消息的類型,如果你願意,你甚至可以很容易地將原始請求作爲一個字段包含在響應中。 – rui 2010-01-21 12:04:39