相关疑难解决方法(0)

Java中是否存在用于协议缓冲区分隔I/O函数的C++等价物?

我正在尝试从C++和Java中的文件读取/写入多个Protocol Buffers消息.谷歌建议在消息之前写长度前缀,但默认情况下没办法(我可以看到).

但是,2.1.0版中的Java API收到了一组"Delimited"I/O函数,显然可以完成这项工作:

parseDelimitedFrom
mergeDelimitedFrom
writeDelimitedTo
Run Code Online (Sandbox Code Playgroud)

有C++等价物吗?如果没有,那么Java API附加的大小前缀是什么,所以我可以用C++解析这些消息?


更新:

这些现在存在于google/protobuf/util/delimited_message_util.hv3.3.0中.

c++ java serialization protocol-buffers

64
推荐指数
7
解决办法
2万
查看次数

如何将HTTP消息从另一个节点解析到gRPC服务器

我可以成功运行gRPC client,并gRPC serverc++现在我希望建立节点A和GRPC服务器即之间的通信node B的连接形象.

我可以参考下面的任何例子是我正在寻找的.

我有这个节点Ahttp消息(GET方法)我需要解析,即提取消息并在节点C上运行请求.我应该在节点A和gRPC服务器之间寻找什么.

提前致谢

http消息到gRPC服务器

c++ http grpc grpc-web

15
推荐指数
1
解决办法
362
查看次数

使用boost :: asio发送Protobuf消息

我试图使用Google的Protocol Buffers和boost :: asio在C++中一起破解客户端.

我的问题是我不知道如何将protobuf消息提供给asio.我有的是这个:

// set up *sock - works
PlayerInfo info;
info.set_name(name);
// other stuff
Run Code Online (Sandbox Code Playgroud)

现在我知道以下是错误的,但我会发布它:

size_t request_length = info.ByteSize();
boost::asio::write(*sock, boost::asio::buffer(info, request_length));
Run Code Online (Sandbox Code Playgroud)

我知道我必须以不同的方式将我的信息打包到缓冲区 - 但是如何?

一般来说,我很难搞清楚boost :: asio是如何工作的.有一些教程,但它们通常只包括发送标准数据格式,如ints,它是开箱即用的.我认为我的问题是序列化,但另一方面我了解到protobuf应该为我做这个......现在我很困惑;)

谢谢你的帮助!

- > Daniel Gehriger提供了解决方案,非常感谢!

c++ networking boost protocol-buffers boost-asio

11
推荐指数
1
解决办法
6405
查看次数

使用boost :: asio :: read_async读取Protobuf对象

我正在使用Boost asio编写一个应用程序,其中客户端和服务器交换使用google proto-buffers序列化的消息.我不知道通过网络发送的序列化消息的大小是多少.似乎proto-buf对象没有任何分隔符.

以下是.proto文件的内容.

 package tutorial;

message Person {
        required string name = 1;
        required int32 id = 2;
        optional string email = 3;
}
Run Code Online (Sandbox Code Playgroud)

这是我从服务器写的方式

        tutorial::Person p;
        p.set_name("abcd pqrs");
        p.set_id(123456);
        p.set_email("abcdpqrs@gmail.com");
        write(p);

        boost::asio::streambuf b;
        std::ostream os(&b);
        p.SerializeToOstream(&os);
        boost::asio::async_write(socket_, b,
                        boost::bind(&Server::handle_write, this,
                                boost::asio::placeholders::error));
Run Code Online (Sandbox Code Playgroud)

在客户端我正在使用boost :: asio :: async_read读取上面发送的消息.如何在下面的代码中找出arg要设置为参数的值boost::asio::transfer_at_least

 boost::asio::async_read(socket_, response_,
                            boost::asio::transfer_at_least(arg),
                            boost::bind(&Client::handle_read_header, this,
                                    boost::asio::placeholders::error));
Run Code Online (Sandbox Code Playgroud)

或者,如何在读取整个对象后确保boost :: async_read返回?

c++ protocol-buffers boost-asio

6
推荐指数
1
解决办法
2792
查看次数