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

detect client connection closed in the grpc server

本文关键字:客户端 连接 grpc 服务器 检测      更新时间:2023-10-16

在grpc-Github(客户端(和(服务器(中提供的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功能(处理程序函数(来通知我们客户端已关闭连接或客户端已终止?

谢谢!

不幸的是,没有。

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

您可以通过以下示例了解如何使用未来的API:client_callback.cc和server_callback.ch

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

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

但它仍然有很多问题,我不建议在生产代码中使用这个API。您可以在那里看到C++回调实现的当前进展:https://github.com/grpc/grpc/projects/12#card-12554506