C++ 使用google proto缓冲区发送/接收数据

C++ 使用google proto缓冲区发送/接收数据,c++,sockets,C++,Sockets,我需要设计一个套接字,它将侦听端口的传入请求,并发送应答以响应这些请求。 这些套接字还将负责在某些事件上向端口发送数据(这与上述接收到的数据无关) 所有这些我都和google proto buffer有关 任何人都可以建议我在这些方面提供一些好的文章或者提供帮助。 < p>你可以使用C++的任何网络库的PROTO缓冲区。要发送proto buffer,只需在proto buffer对象上调用SerializeToArray,然后通过网络发送该数组。若您接收到对象,请使用ParseFromArra

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

所有这些我都和google proto buffer有关


任何人都可以建议我在这些方面提供一些好的文章或者提供帮助。

< p>你可以使用C++的任何网络库的PROTO缓冲区。要发送proto buffer,只需在proto buffer对象上调用
SerializeToArray
,然后通过网络发送该数组。若您接收到对象,请使用
ParseFromArray
函数将数组反序列化回proto buffer对象

boost asio可以用于此,请参见服务器和客户端示例

示例(仅用于展示概念):

类连接{
公众:
连接(常量std::字符串和服务器,常量std::字符串和端口)
尝试
:是否正常(错误)
,解析器(ioservice)
,查询(服务器,端口)
,套接字(ioservice)
{
谷歌协议验证版本;
asio::connect(套接字、解析器、解析(查询));
}catch(…){抛出异常(“无法连接”);}
~connection(){
插座关闭();
}
bool发送和接收(查询*q,响应*r){
如果(0==q)返回false;
int query_length=q->ByteSize();
std::向量buf(查询长度);
if(false==q->SerializeToArray(&(buf[0]),查询长度)){

好吧,谷歌协议缓冲区本身就有很好的文档记录。只需转到
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_;
}