Greg Asked: 2019-05-01 11:07:35 +0800 CST2019-05-01 11:07:35 +0800 CST 2019-05-01 11:07:35 +0800 CST 服务器如何在服务器/客户端拓扑中检测客户端断电 772 我创建了一个通过 TCP 套接字进行通信的客户端和服务器程序。 当我有多个客户端时,我可以看到服务器为每个客户端生成进程。但是如果我的客户端突然断电,服务器并没有关闭相应的进程。 请帮助检测服务器端的客户端断电,以便退出相关进程。 检查客户端是否处于活动状态应该以编程方式完成,并且 ping 不是一种选择,因为防火墙不允许这样做 亲切的问候 server client 1 个回答 Voted Best Answer Jarad Downing 2019-05-01T11:22:21+08:002019-05-01T11:22:21+08:00 请参阅此文档:https ://blog.stephencleary.com/2009/05/detection-of-half-open-dropped.html 从上面的文档中,从最好到最差的排名: 将 keepalive 消息添加到应用程序协议框架(空消息)。长度前缀和定界的系统可以发送空消息(例如,“0 字节”的长度前缀或单个“结束定界符”)。 优点。更高级别的协议(实际消息)不受影响。 缺点。这需要对连接两端的软件进行更改,因此如果应用程序协议已指定且不可变,则可能无法选择。 将 keepalive 消息添加到实际的应用程序协议(“null”消息)。这向应用程序协议添加了一条新消息:一条应该被忽略的“空”消息。 优点。如果应用程序协议使用非统一的消息成帧系统,则可以使用此方法。在这种情况下,无法使用第一种解决方案。 缺点。(与第一个解决方案相同)这需要更改连接两端的软件,因此如果应用程序协议已指定且不可变,则可能无法选择。 假设最坏情况的显式计时器。有一个计时器,并假设计时器到期时连接已经断开(当然,每次传输数据时都会重置计时器)。如果 HTTP 服务器支持持久连接,这就是它们的工作方式。 优点。不需要更改应用协议;在无法更改远程端代码的情况下,不能使用前两种解决方案。此外,该解决方案导致的网络流量更少;它是唯一不涉及发送keepalive(即,“你还在吗?”)数据包的解决方案。 缺点。根据协议,这可能会导致大量有效连接被丢弃。 操作 TCP/IP keepalive 数据包设置。这是一个极具争议性的解决方案,对于利弊都有复杂的论据。Stevens 的书第 23 章对此进行了深入讨论。本质上,这指示 TCP/IP 堆栈代表应用程序定期发送 keepalive 数据包。 优点。一旦设置 keepalive 参数的代码工作正常,应用程序就不需要更改任何其他内容。其他解决方案都有应用程序必须响应的计时器事件;这是“一劳永逸”。 缺点。RFC 1122,第 4.2.3.6 节指出路由器可能无法可靠地传输没有数据的 TCP keepalive 确认;这可能会导致有效连接被丢弃。此外,TCP/IP 堆栈根本不需要支持 keepalive(许多嵌入式堆栈不支持),因此该解决方案可能无法转换为其他平台。
请参阅此文档:https ://blog.stephencleary.com/2009/05/detection-of-half-open-dropped.html
从上面的文档中,从最好到最差的排名:
优点。更高级别的协议(实际消息)不受影响。
缺点。这需要对连接两端的软件进行更改,因此如果应用程序协议已指定且不可变,则可能无法选择。
优点。如果应用程序协议使用非统一的消息成帧系统,则可以使用此方法。在这种情况下,无法使用第一种解决方案。
缺点。(与第一个解决方案相同)这需要更改连接两端的软件,因此如果应用程序协议已指定且不可变,则可能无法选择。
优点。不需要更改应用协议;在无法更改远程端代码的情况下,不能使用前两种解决方案。此外,该解决方案导致的网络流量更少;它是唯一不涉及发送keepalive(即,“你还在吗?”)数据包的解决方案。
缺点。根据协议,这可能会导致大量有效连接被丢弃。
优点。一旦设置 keepalive 参数的代码工作正常,应用程序就不需要更改任何其他内容。其他解决方案都有应用程序必须响应的计时器事件;这是“一劳永逸”。
缺点。RFC 1122,第 4.2.3.6 节指出路由器可能无法可靠地传输没有数据的 TCP keepalive 确认;这可能会导致有效连接被丢弃。此外,TCP/IP 堆栈根本不需要支持 keepalive(许多嵌入式堆栈不支持),因此该解决方案可能无法转换为其他平台。