问题描述
我有一个用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对象设置为立即触发,并导致取消调用处理程序。但是,如果我在终止客户端进程后不尝试发送数据(或设置警报),那么就没有通知或回调,我已经能够找到/启用。我不能完全理解。所以:
- 对于服务器,丢失连接的检测如何表现出来?是否有回调方法或某种通知?我的服务器没有收到任何错误;完成队列的“ Next()”方法永不返回,依此类推。
- 这种检测对一元(呼叫/响应)方法和流方法都有效吗?
- 服务器是否检测到丢失的连接是否起作用,无论客户端是否实现了丢失的连接/保持活动逻辑?
- 除了keepalive通道参数之外还有其他方法吗?
谢谢-感谢您的帮助。
解决方法
取消请求后,您可以使用ServerContext::AsyncNotifyWhenDone()
接收通知。