在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
功能(处理程序功能)可通知我们客户端已关闭连接或客户端已终止?
谢谢!
答案 0 :(得分:1)
不幸的是,没有。
但是现在,gRPC团队的成员正在努力将回调机制实现为C ++实现。据我了解,它的工作方式与Java实现(https://youtu.be/5tmPvSe7xXQ?t=1843)相同。
您可以在下面的示例中看到如何使用将来的API:client_callback.cc和server_callback.cc
您感兴趣的地方是ServerBidiReactor
服务器端命名空间中的::grpc::experimental
类。它具有OnDone
和OnCancel
通知方法,可能会帮助您。
另一个有趣的地方是,您可以存储指向连接对象的指针,并随时向客户端发送通知。
但是它仍然有很多问题,我不建议在生产代码中使用此API。 您可以在此处查看C ++回调实现的最新进展:https://github.com/grpc/grpc/projects/12#card-12554506