简体   繁体   English

使用Google Proto缓冲区发送/接收数据

[英]send/receive data using google proto buffer

I need to design a socket which will listen to a port for incoming requests and send reply in response to these requests. 我需要设计一个套接字,该套接字将侦听端口的传入请求并发送对这些请求的响应。 These sockets will also be responsible for sending data to port on some events ( which has nothing to do with data received mentioned above). 这些套接字还将负责在某些事件上将数据发送到端口(与上述接收到的数据无关)。

All this I have to do with google proto buffer. 我所有与Google Proto缓冲区有关的内容。

Can anyone please suggest me with some good articles on these OR provide me help with this. 任何人都可以在这些方面给我一些好的文章来建议我,或者为我提供帮助。

You can use proto buffers with any networking library for C++. 您可以将原型缓冲区与任何用于C ++的网络库一起使用。 To send proto buffer just call SerializeToArray on your proto buffer object and send that array via network. 要发送原型缓冲区,只需在原型缓冲区对象上调用SerializeToArray并通过网络发送该数组。 If you receive object, use ParseFromArray function to deserialize your array back to proto buffer object. 如果收到对象,请使用ParseFromArray函数将数组反序列化为原始缓冲区对象。

boost asio could be used for that, see examples of servers and client here boost asio可以用于此目的,请参见此处的服务器和客户端示例

example (just for showing the concept): 示例(仅用于显示概念):

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_;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM