我用 Indy (TCPServer/Client) 编写了一个 Delphi (2009) 应用程序。而且我在 TCPServer 级别有一个问题:它仅在客户端再次尝试重新连接到服务器时才检测到客户端的断开连接(在重新启动 PC 后)。我已经逐步执行了我的应用程序,当客户端尝试重新连接时(重新启动后),服务器会引发(我认为是静默)异常:连接由对等方重置。为什么这个例外为时已晚。
(我认为线程列表不会立即发布)
你怎么看 ?
我用 Indy (TCPServer/Client) 编写了一个 Delphi (2009) 应用程序。而且我在 TCPServer 级别有一个问题:它仅在客户端再次尝试重新连接到服务器时才检测到客户端的断开连接(在重新启动 PC 后)。我已经逐步执行了我的应用程序,当客户端尝试重新连接时(重新启动后),服务器会引发(我认为是静默)异常:连接由对等方重置。为什么这个例外为时已晚。
(我认为线程列表不会立即发布)
你怎么看 ?
这是 TCP 协议的低级细节。默认情况下,它不传输keep-alive数据包,因为这会浪费带宽,因此只有在发生提示它检查连接的事情时才会意识到连接已经断开。(我不确定为什么来自同一个客户端的重新连接会触发这种情况。)
您可以让 TCP 发送定期保持活动数据包以更早地发现断开连接。在 Windows 中,这可以由服务器应用程序激活,但通过注册表进行配置(有关详细信息,请参见此处)。
您还可以通过让客户端或服务器偶尔发送空数据包(一个什么都不做的数据包)来实现协议级别的保持活动机制。这显然要求您使用的协议定义某种无所事事或无所事事的消息(NOOP、STATUS、PING ......类似的东西)。