【发布时间】:2020-12-03 15:57:06
【问题描述】:
所以我使用 gRPC 将数据存储在键值存储中。
原型如下所示:
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;
}
现在的问题是,如果我们将图像作为字节数据发送过来,其中可以包含空字节,那么当服务器在Request 对象中接收到它时,它会将其视为字符串;当它这样做时,它只会读取第一个空字节。
我们如何在客户端打包Request 对象:
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
}
【问题讨论】:
-
it treats it as a string; when it does this it only reads it up the the first null byte这不是std::string的工作方式;它可以在中间包含空字节就好了。