检测在grpc服务器中关闭的客户端连接

时间:2019-11-02 08:42:15

标签: c++ asynchronous grpc

在grpc Github(client)和(server)提供的unary RPC示例中,有什么方法可以检测到客户端的关闭连接?

例如,在server.cc文件中:

std::string prefix("Hello ");
reply_.set_message(prefix + request_.name());

// And we are done! Let the gRPC runtime know we've finished, using the
// memory address of this instance as the uniquely identifying tag for
// the event.
status_ = FINISH;
int p = 0,i=0;
while(i++ < 1000000000) { // some dummy work
        p = p + 10;
}
responder_.Finish(reply_, Status::OK, this);

使用此虚拟任务,然后将响应发送回客户端,服务器将花费几秒钟。如果我们关闭客户端(例如用Ctrl+C说),则服务器不会引发任何错误。它只是调用Finish,然后像Finish成功一样重新分配对象。

服务器端是否有任何async功能(处理程序功能)可通知我们客户端已关闭连接或客户端已终止?

谢谢!

1 个答案:

答案 0 :(得分:1)

不幸的是,没有。

但是现在,gRPC团队的成员正在努力将回调机制实现为C ++实现。据我了解,它的工作方式与Java实现(https://youtu.be/5tmPvSe7xXQ?t=1843)相同。

您可以在下面的示例中看到如何使用将来的API:client_callback.ccserver_callback.cc

您感兴趣的地方是ServerBidiReactor服务器端命名空间中的::grpc::experimental类。它具有OnDoneOnCancel通知方法,可能会帮助您。

另一个有趣的地方是,您可以存储指向连接对象的指针,并随时向客户端发送通知。

但是它仍然有很多问题,我不建议在生产代码中使用此API。 您可以在此处查看C ++回调实现的最新进展:https://github.com/grpc/grpc/projects/12#card-12554506