GRPC C ++客户端finish()使用Golang服务器永久阻止

时间:2018-02-22 03:46:45

标签: c++ go grpc

我有一个C ++ gRPC客户端和Golang gRPC服务器。对于双向流,当客户端想要关闭流时,它会在调用Finish()时永久阻塞。

只有在无错误时才会发生这种情况,即服务器rpc函数返回nil。如果服务器是用C ++编写的,我知道它会返回Status::Ok

如果Golang服务器返回非零错误,则Finish()函数按预期返回。只有在没有错误的情况下才会出现问题。

示例:

.proto

service StreamTest {
  rpc Get(stream StreamCommand) returns (stream Result) {}
}
message StreamCommand{
  string cmd = 1;
}
message Result {
  string res = 1;
}

的.cpp

std::unique_ptr<ClientReaderWriter<StreamCommand, Result>> readerWriter;
bool Get(Result &res) {
    return readerWriter->Read(&res);
}

bool CloseClient() {
    StreamCommand cmd;
    cmd.set_cmd("stop");
    readerWriter->Write(cmd);
    readerWriter->WritesDone();
    Status status = readerWriter->Finish(); // <------ BLOCKING
    return status.ok();
}

我已经使用Golang gRPC客户端测试了服务器,它运行正常。服务器是否应该返回nil错误以外的内容?我应该将此报告为错误吗?

任何帮助表示赞赏!谢谢!

1 个答案:

答案 0 :(得分:0)

我不熟悉Go,但我知道c ++层。你能用GRPC_VERBOSITY = debug和GRPC_TRACE = api运行客户端吗?这样可以更深入地了解问题。