【问题标题】:detect client connection closed in the grpc server检测在 grpc 服务器中关闭的客户端连接
【发布时间】:2019-11-02 08:42:15
【问题描述】:

在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 功能(处理函数)来通知我们客户端已关闭连接或客户端已终止?

谢谢!

【问题讨论】:

    标签: c++ asynchronous grpc


    【解决方案1】:

    很遗憾,没有。

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

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

    您感兴趣的一点是来自服务器端::grpc::experimental 命名空间的ServerBidiReactor 类。它有OnDoneOnCancel 通知方法,也许可以帮助你。

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

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

    【讨论】:

    • C++ 中的流式 grpc 是否提供这样的回调?
    • 没有。使用流媒体,您不能在服务器上存储连接提供程序。使用 C++ 的当前实现,您只能通过下一个方案工作:客户端发出请求 -> 服务器接收它并准备一个答案。 -> 服务器使用最后一个包发送回复 - “完成”命令 -> TCP 连接关闭(并且无法保存以备将来使用)
    猜你喜欢
    • 1970-01-01
    • 2019-12-05
    • 2020-04-03
    • 2017-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多