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