2014-09-12 49 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_; 
}