在C ++ gRPC异步服务器中为丢失的连接提供了什么通知

问题描述

我有一个用C ++编写的Windows异步gRPC服务器。我想检测与客户端的连接丢失–是否丢失了网络连接或客户端崩溃等。我看到了对keepalive通道参数的引用,并且尝试了这些设置的各种组合,例如:

builder.AddChannelArgument(GRPC_ARG_KEEPALIVE_TIME_MS,10000);
builder.AddChannelArgument(GRPC_ARG_KEEPALIVE_TIMEOUT_MS,10000);
builder.AddChannelArgument(GRPC_ARG_KEEPALIVE_PERMIT_WITHOUT_CALLS,1);
builder.AddChannelArgument(GRPC_ARG_HTTP2_MIN_RECV_PING_INTERVAL_WITHOUT_DATA_MS,9000);
builder.AddChannelArgument(GRPC_ARG_HTTP2_BDP_PROBE,1);

我已经使用流式RPC方法进行了一些测试。如果我终止了客户端进程,然后尝试将数据发送到客户端,则会检测到丢失的连接。实际上,我什至不必发送数据。我可以将Alarm对象设置为立即触发,并导致取消调用处理程序。但是,如果我在终止客户端进程后不尝试发送数据(或设置警报),那么就没有通知或回调,我已经能够找到/启用。我不能完全理解。所以:

  1. 对于服务器,丢失连接的检测如何表现出来?是否有回调方法或某种通知?我的服务器没有收到任何错误;完成队列的“ Next()”方法永不返回,依此类推。
  2. 这种检测对一元(呼叫/响应)方法和流方法都有效吗?
  3. 服务器是否检测到丢失的连接是否起作用,无论客户端是否实现了丢失的连接/保持活动逻辑?
  4. 除了keepalive通道参数之外还有其他方法吗?

谢谢-感谢您的帮助。

解决方法

取消请求后,您可以使用ServerContext::AsyncNotifyWhenDone()接收通知。

https://grpc.github.io/grpc/cpp/classgrpc__impl_1_1_server_context_base.html#a0f1289f31257e6dbef57bc901bd7b5f2