You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++ gRPC如何将嵌入消息ServerInfo从服务端发送至客户端

gRPC C++ 嵌套消息返回实现方案

针对你定义的包含嵌套ServerInfo消息的proto结构,服务端有两种常用的赋值方式将数据写入HelloReply返回:

  • 方式1:直接通过mutable指针操作嵌套字段(推荐,无需额外构造临时对象)
    protobuf为message类型的字段生成mutable_字段名方法,返回嵌套消息的可写指针,直接操作该指针赋值即可,示例代码如下:

    #include "sample.grpc.pb.h"
    #include <grpcpp/grpcpp.h>
    
    using grpc::ServerContext;
    using grpc::Status;
    using sample::HelloReply;
    using sample::HelloRequest;
    using sample::Sample;
    using sample::ServerInfo;
    
    class SampleServiceImpl final : public Sample::Service {
      Status Hello(ServerContext* context, const HelloRequest* request, HelloReply* reply) override {
        // 直接获取sinfo字段的可写指针
        ServerInfo* server_info = reply->mutable_sinfo();
        // 给ServerInfo的字段赋值
        server_info->set_name("业务测试服务");
        server_info->set_os("CentOS 7.9");
        return Status::OK;
      }
    };
    
  • 方式2:先独立构造ServerInfo对象,再赋值给响应
    如果你已经提前构造好了ServerInfo实例,可以直接赋值给mutable指针指向的对象,示例代码如下:

    Status Hello(ServerContext* context, const HelloRequest* request, HelloReply* reply) override {
      // 提前构造并赋值ServerInfo
      ServerInfo info;
      info.set_name("业务测试服务");
      info.set_os("CentOS 7.9");
      // 赋值给HelloReply的sinfo字段
      *reply->mutable_sinfo() = info;
      return Status::OK;
    }
    

客户端读取嵌套字段的方法

客户端收到响应后,通过字段名()方法获取嵌套消息的只读引用即可读取内部字段:

// 客户端调用示例
HelloRequest req;
req.set_name("测试调用端");
HelloReply rep;
grpc::ClientContext ctx;
std::unique_ptr<Sample::Stub> stub = Sample::NewStub(grpc::CreateChannel("127.0.0.1:50051", grpc::InsecureChannelCredentials()));
Status status = stub->Hello(&ctx, req, &rep);
if (status.ok()) {
  std::cout << "服务端名称:" << rep.sinfo().name() << std::endl;
  std::cout << "服务端操作系统:" << rep.sinfo().os() << std::endl;
}

核心说明

protobuf针对message类型的字段不会生成基础类型那样的set_字段名方法,而是生成两类方法:

  • 写操作:mutable_字段名()返回嵌套消息的可写指针
  • 读操作:字段名()返回嵌套消息的只读常量引用

内容的提问来源于stack exchange,提问作者Prasanna

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 05:06:01