C++ 如何使用C/C+通过gRPC发送字节数据+;?
所以我使用gRPC将数据存储在键值存储中 protos看起来像这样:C++ 如何使用C/C+通过gRPC发送字节数据+;?,c++,grpc,C++,Grpc,所以我使用gRPC将数据存储在键值存储中 protos看起来像这样: syntax = "proto3"; package keyvaluestore; service KeyValueStore { rpc AddUser(Credentials) returns (Response) {} rpc Get(Request) returns (Response) {} rpc Put(Request) returns (Response) {} rpc
syntax = "proto3";
package keyvaluestore;
service KeyValueStore {
rpc AddUser(Credentials) returns (Response) {}
rpc Get(Request) returns (Response) {}
rpc Put(Request) returns (Response) {}
rpc Cput(Request) returns (Response) {}
rpc Delete(Request) returns (Response) {}
}
message Credentials {
string user = 1;
string passwd = 2;
}
message Request {
string user = 1;
string key = 2;
bytes val = 3;
bytes val2 = 4;
string addr = 5;
string command = 6;
}
message Response {
bytes val = 1;
uint32 nbytes = 2;
string message = 3;
}
现在的问题是,如果我们发送一个图像作为字节数据,可以包含空字节,那么当服务器在请求
对象中接收到它时,它将其视为一个字符串;当它这样做时,它只读取第一个空字节
如何在客户端打包请求
对象:
bool KeyValueStoreClient::Put(const string& user, const string& key, const char* val) {
Request req;
req.set_user(user);
req.set_key(key);
req.set_val(val);
ClientContext ctx;
Response res;
Status status = stub_->Put(&ctx, req, &res);
}
服务器以字符串形式接收req->val()
,而不是char*
:
Status KeyValueStoreServiceImpl::Put(ServerContext* ctx, const Request* req, Response* res) {
// req->val() is a string
}
在方法
Put
中,val
参数是const char*
,而不是std::string
Protobuf说,当使用const char*
设置值时(void set\u foo(const char*value)
重载),它使用第一个\0
作为终止符
使用
void set\u foo(const char*value,int size)
重载显式告诉它大小。它将其视为字符串;当它这样做时,它只读取第一个空字节
这不是std::string
的工作方式;它可以在中间包含空字节,你的答案很快就能解开很多信息,很好!从上面重载函数的文档中可以看出:“字符串大小是显式给定的,而不是通过查找空终止符字节来确定的”。