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

问题描述 投票:0回答:1

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

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

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

例:

。因此

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错误之外的其他内容吗?我应该将此报告为错误吗?

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

c++ go grpc
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.