0

我需要使用现有的 C++ 支持的 protobuf 服务器(需要与 unix 套接字连接)来接收 protobuf 请求。我想使用 golang 作为 protobuf 客户端向服务器发送请求。但是我发现 C++ 和 golang 中自动生成的消息定义是不同的。在 ::google::protobuf::Message 的 C++ 版本的 protobuf 中有更多定义。我使用以下命令根据相同的 proto 定义生成 c++ protobuf 定义:

protoc --proto_path=src --cpp_out=. src/sample.proto
protoc --proto_path=src --go_out=. src/sample.proto

但是使用生成的sample.pb.cc、sample.pb.h和sample.pb.go,golang客户端消息格式是c++服务器无法识别的。

有没有办法让这个 golang 客户端 c++ 服务器 protobuf 通信工作?谢谢。

============================ 2021.1.6更新:在此处添加示例:

目录结构:

test
├── test.pb.cc
├── test.pb.go
├── test.pb.h
└── test.proto

原型文件:

syntax = "proto2";

option go_package = "./;test";

package test;

message test {
    required uint64 key = 1;
}

protoc 命令生成 test.pb.go、test.pb.h、test.ph.cc 文件:

protoc --proto_path=test --cpp_out=test test/test.proto
protoc --proto_path=test --go_out=test test/test.proto

然后可以在test.pb.go中看到golang生成的数据结构:

type Test struct {
    state         protoimpl.MessageState
    sizeCache     protoimpl.SizeCache
    unknownFields protoimpl.UnknownFields

    Key *uint64 `protobuf:"varint,1,req,name=key" json:"key,omitempty"`
}

C++生成的数据结构:

class test : public ::google::protobuf::Message {
  ... // I'll ignore function definition

  static const int kKeyFieldNumber = 1;
  ::google::protobuf::UnknownFieldSet _unknown_fields_;
  ::google::protobuf::uint64 key_;
  mutable int _cached_size_;
  ::google::protobuf::uint32 _has_bits_[(1 + 31) / 32];
  static test* default_instance_;
}

这两者似乎不匹配......例如,_has_bits_字段类型在c ++生成的代码中起着重要作用,而在golang生成的代码中没有相关的逻辑。

// required uint64 key = 1;
inline bool test::has_key() const {
  return (_has_bits_[0] & 0x00000001u) != 0;
}
inline void test::set_has_key() {
  _has_bits_[0] |= 0x00000001u;
}
inline void test::clear_has_key() {
  _has_bits_[0] &= ~0x00000001u;
}
inline void test::clear_key() {
  key_ = GOOGLE_ULONGLONG(0);
  clear_has_key();
}
inline ::google::protobuf::uint64 test::key() const {
  return key_;
}
inline void test::set_key(::google::protobuf::uint64 value) {
  set_has_key();
  key_ = value;
}
4

0 回答 0