1、rpc调用崩溃
E0419 10:08:46.849554931 1497456 client_context.cc:129] ASSERTION FAILED: call_ == nullptr
解决:grpc::ClientContext context; 每个rpc调用都新建一个context,不要复用
2、grpc::ClientReader外部中断
// 内部while死循环
while(m_pReader->Read(&response)) {
// do something
}
解决:在grpc::ClientReader类里定义成员方法TryCancel
void TryCancel() {
if(context_) {
context_->TryCancel();
}
}
3、grpc启用ssl(客户端)
std::string LoadFile(const std::string& strFile)
{
std::string strFileData;
std::fstream fin(strFile, std::ios::in);
if (fin.is_open())
{
fin.seekg(0, std::ios::end);
int64_t nFileSize = fin.tellg();
fin.seekg(0, std::ios::beg);
std::vector<char>vecData(nFileSize + 1, 0);
fin.read(vecData.data(), nFileSize);
fin.close();
strFileData = vecData.data();
}
return strFileData;
}
int main() {
std::string strServerUrl("192.168.1.234:6666");
grpc::ChannelArguments argsChannel;
// set cert info
grpc::SslCredentialsOptions optSsl;
optSsl.pem_root_certs = LoadFile("server.crt");
// set domain
argsChannel.SetSslTargetNameOverride("www.domain.com");
auto credsChannel = grpc::SslCredentials(optSsl);
// create channel
std::shared_ptr<grpc::Channel> pChannel = grpc::CreateCustomChannel(strServerUrl, credsChannel, argsChannel);
// crate stub and invoke()
#if 0
try {
ClientImpl<Greeter::Stub> cltGreeter(Greeter::NewStub(pChannel));
Status status = cltGreeter.GetStub()->SayHello(&context, request, &replyRpc);
}
catch (...) {
std::cout << "grpc invoke exception: ";
}
#endif
std::cout << "grpc test end.";
return 0;
}
PS:需要证书(servert.cert)和证书验证服务器(www.domain.com)