【问题标题】:Upload File to a server using Protocol Buffer in C++使用 C++ 中的协议缓冲区将文件上传到服务器
【发布时间】:2020-04-02 17:02:19
【问题描述】:

我的目标是将文件分块,然后使用流连接将文件发送到使用 gRPC++ 的服务器。有人可以确认以下代码是否适用于客户端吗?

我的 proto 文件有一个对象“字节”

message FileContent {
  bytes content = 1;
}

客户代码

char *buffer = new char[2048];
// Open a stream-based connection with the gRPC server
std::unique_ptr<ClientWriter<FileContent> > writer(this->service_stub->Store(&context, &fileack));

// send the file name to the server
filecontent.set_content(filename);
std::cout << "Client: RPC call with File Name:" << filecontent.content() << endl;
writer->Write(filecontent);

// Get a file handle for the file we want to upload and the file length 

fileStream.open(filename, ios::binary);


while (!fileStream.eof())
{
     std::this_thread::sleep_for(std::chrono::milliseconds(100));
     filecontent.clear_content();
     fileStream.read(buffer,2048);
     filecontent.set_content(std::string(buffer, 2048));
     writer->Write(filecontent);
}

服务器代码

    Status Store(ServerContext* context, ServerReader<FileContent>* reader, FileAck* fileack) override {

 FileContent filecontent;
 ofstream fileStream;
 std::string serverfilepath;

 if (fileStream.is_open())
 {
     std::cout << "Reading Data";
     while (reader->Read(&filecontent))
     {
         std::cout << "Reading Data";
         fileStream << filecontent.mutable_content();
     }

     fileStream.close();
 }

 else
 {
    reader->Read(&filecontent);
    fileStream.open(serverfilepath, ios::binary);
 }

 return Status::OK;

}

【问题讨论】:

    标签: c++ protocol-buffers grpc


    【解决方案1】:

    protobuf bytes 类型在 C++ 端生成 std::string 类型的字段。因此,您的 char *buffer 被隐式转换为 std::string。

    问题是用于此的constructor 需要一个以空字符结尾的字符串,但是您的buffer 没有终止符字节(也不能,因为它可能在中间包含\0 字节)。这可能会导致std::string 构造函数在缓冲区末尾运行以寻找终止符字节。

    要解决此问题,请明确构造 std::string 的长度:

    filecontent.set_content(std::string(buffer, 2048));
    

    【讨论】:

      猜你喜欢
      • 2021-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-23
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      • 2012-08-09
      相关资源
      最近更新 更多