2014-09-12 71 views
1

我需要設計一個套接字,它將偵聽傳入請求的端口併發送回復以響應這些請求。 這些套接字也將負責在某些事件上發送數據到端口(與上面提到的數據無關)。使用谷歌原型緩衝區發送/接收數據

這一切,我必須做的谷歌原型緩衝區。

任何人都可以請建議我一些關於這些好文章或提供我這方面的幫助。

+0

那麼,谷歌協議緩衝區真的是有據可查的自己。只需訪問https://code.google.com/p/protobuf/ – mrVoid 2014-09-12 12:37:52

回答

0

您可以使用proto緩衝區與C++的任何網絡庫。要發送proto緩衝區,只需在您的proto緩衝區對象上調用SerializeToArray並通過網絡發送該數組。如果您收到對象,請使用ParseFromArray函數將您的數組反序列化回原始緩衝區對象。

升壓ASIO可用於的是,看到服務器和客戶端here

例子的例子(只是爲了表示其原理):

class connection { 
public: 
    connection(const std::string& server, const std::string& port) 
     try 
      : is_ok_(false) 
      , resolver_(ioservice_) 
      , query_ (server, port) 
      , socket_ (ioservice_) 
     { 
      GOOGLE_PROTOBUF_VERIFY_VERSION; 
      asio::connect(socket_, resolver_.resolve(query_)); 
     } catch (...) { throw exception("Couldn't connect"); } 

    ~connection() { 
     socket_.close(); 
    } 

    bool send_receive(Query* q, Response* r) { 
     if (0 == q) return false; 

     int query_length = q->ByteSize(); 
     std::vector<uint8_t> buf(query_length); 

     if (false == q->SerializeToArray(&(buf[0]), query_length)) { 
      std::cerr << "Couldn't serialize protobuf" << std::endl; 
      return false; 
     } 
     socket_.write_some(asio::buffer(buf)); 
     if (0 == r) return false; 

     size_t s = socket_.read_some(asio::buffer(buf)); 
     r->ParseFromArray(&(buf[0]), (int)buf.size()); 
    } 
private: 
    boost::asio::io_service ioservice_; 
    tcp::resolver   resolver_; 
    tcp::resolver::query query_; 
    tcp::socket    socket_; 
    bool     is_ok_; 
}