使用谷歌protobuf发送/接收数据

时间:2014-09-12 12:12:40

标签: c++ sockets

我需要设计一个套接字,它将侦听传入请求的端口并发送回复以响应这些请求。 这些套接字还负责在某些事件上将数据发送到端口(这与上面提到的数据无关)。

所有这一切都与google proto buffer有关。

任何人都可以建议我提供一些关于这些的好文章或者为我提供帮助。

1 个答案:

答案 0 :(得分:0)

您可以将proto缓冲区与任何C ++网络库一起使用。要发送proto缓冲区,只需在proto缓冲区对象上调用SerializeToArray,然后通过网络发送该数组。如果您收到对象,请使用ParseFromArray函数将数组反序列化回原始缓冲区对象。

可以使用boost 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_;
}