c++ - 在 gRPC c++ 中,有没有办法在对等方断开连接时得到通知?

标签 c++ grpc

我已经实现了一个 gRPC 服务器应用程序,多个客户端可以连接到它并调用 RPC。
在客户端断开连接或客户端重新启动的情况下,我想知道哪个客户端断开连接,以便我可以针对该客户端进行一些清理。
同样,如果服务器宕机,客户端如何得到通知?
gRPC c++ 堆栈是否向应用程序提供通知/回调?如果不是,那么处理任何一方的连接终止的最佳方法是什么?

最佳答案

Tcp 是一个空闲协议(protocol),因此为了检测断开的连接,您必须实现某种类型的 ping/pong 和计时器来抛出断开的连接,因此您应该执行以下操作:
在一侧(例如客户端):

  • 你有一个等待一段时间(比如 1 分钟)的计时器
  • 对服务器的每次写入都将暂停计时器
  • 收到数据包时,您会更新上次收到数据包的时间
  • 当计时器到期时,您检查是否已达到 ping 时间(您一分钟内没有发送任何内容),如果是,则发送 ping 消息,服务器应回复。如果连接断开,您可能会在发送时收到错误。
  • 检查 ping 时间后,检查您上次收到数据包的时间,如果超过所选 session 超时(应该长于 ping 超时),则服务器无法响应您的消息,ping 所以断开连接

  • 在另一边(例如服务器):
  • 你有一个等待 session 超时的计时器
  • 对客户端的每次写入都将暂停计时器
  • 收到数据包时,您会更新上次收到数据包的时间
  • 一旦你得到一个 ping 发送一个 pong 消息通知客户端你仍然连接
  • 当计时器过期时,检查您上次收到数据包的时间,如果超过 session 超时,则客户端无法 ping 服务器或发送任何消息,因此假设客户端已断开连接并断开连接

  • 除此之外,任何来自读、写的错误(非阻塞错误和喜欢除外)都被视为断开连接。
    请注意,ping 和 pong 很重要,因为您可以仅在需要时(完成某些工作时)发送其他消息,这可能需要很长时间,因此在此期间您应该 ping 服务器以检查它是否仍与您连接

    关于c++ - 在 gRPC c++ 中,有没有办法在对等方断开连接时得到通知?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63374898/

    相关文章:

    c++ - 确保重新编译时处理定义

    c++ - 如何在模板参数中使用 >(大于)而不出现解析错误?

    c++ - N 位环绕的整数减法

    node.js - gRPC Node 服务器: how to load protobuf file from a different Git repo?

    json - 如何在protobuf或grpc中使用json作为结构体成员?

    c++ - 使用 C++ 中的 Protocol Buffer 将文件上传到服务器

    go - Bigtable 客户端初始化卡在 Kubernetes 容器中

    c++ - 我可以从 opengl 的显示屏上调用我的回调函数吗

    c++ - 如何从 system() 获取 shell 输出?

    hyperledger-fabric - gRPC 失败,在多个节点上的 Hyperledger Fabric 区 block 链上执行链代码时