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

Sac*_*j S 6 c++ grpc

我已经实现了一个 gRPC 服务器应用程序,多个客户端可以连接到它并调用 RPC。在客户端断开连接或客户端重新启动的情况下,我想知道哪个客户端断开连接,以便我可以执行与该客户端对应的一些清理操作。

同样,如果服务器出现故障,客户端如何得到通知?

gRPC C++ 堆栈是否向应用程序提供通知/回调?如果不是,处理双方连接终止的最佳方法是什么?

dev*_*v65 1

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

一侧(例如客户端):

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

在另一端(例如服务器):

  • 你有一个等待会话超时的计时器
  • 每次写入客户端都会使计时器休息
  • 收到数据包时,您会更新上次收到数据包的时间
  • 一旦收到 ping 信号,请发送一条 pong 消息,通知客户端您仍然处于连接状态
  • 当计时器到期时,检查您上次收到数据包的时间,如果超过会话超时,则客户端无法 ping 服务器或发送任何消息,因此假设客户端已断开连接并断开连接

除此之外,任何来自读取、写入的错误(非阻塞错误等除外)都被视为断开连接。

请注意,ping 和 pong 很重要,因为您可能只在需要时(完成某些工作时)发送其他消息,这可能需要很长时间,因此在此期间您应该 ping 服务器以检查它是否仍然与您保持连接