Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 检查连接是否关闭!_Delphi_Connection_Indy_Reset - Fatal编程技术网

Delphi 检查连接是否关闭!

Delphi 检查连接是否关闭!,delphi,connection,indy,reset,Delphi,Connection,Indy,Reset,我已经用Indy(TCPServer/Client)编写了一个Delphi(2009)应用程序。 我在TCPServer级别遇到了一个问题:只有当客户端再次尝试重新连接到服务器时,它才会检测到客户端的断开连接(在电脑重新启动后)。 我已经一步一步地执行了我的应用程序,当客户端尝试顶部重新连接时(在重新启动后),服务器会引发(我认为是一个无声的)异常:由对等方重置连接。 为什么这个例外太晚了 (我认为线程列表器不会立即发布) 你怎么看?这是TCP协议的底层细节。默认情况下,它不会传输保持活动状态的

我已经用Indy(TCPServer/Client)编写了一个Delphi(2009)应用程序。 我在TCPServer级别遇到了一个问题:只有当客户端再次尝试重新连接到服务器时,它才会检测到客户端的断开连接(在电脑重新启动后)。 我已经一步一步地执行了我的应用程序,当客户端尝试顶部重新连接时(在重新启动后),服务器会引发(我认为是一个无声的)异常:由对等方重置连接。 为什么这个例外太晚了

(我认为线程列表器不会立即发布)


你怎么看?

这是TCP协议的底层细节。默认情况下,它不会传输保持活动状态的数据包,因为这会浪费带宽,因此只有在发生提示它检查连接的事件时,它才会意识到连接已断开。(但我不确定为什么来自同一个客户端的重新连接会触发这种情况。)

您可以让TCP发送定期保持活动的数据包,以便更早地发现断开的连接。在windows中,这可以由服务器应用程序激活,但可以通过注册表进行配置(有关详细信息,请参阅)


您还可以通过让客户端或服务器偶尔发送空数据包(一个没有特殊功能的数据包),在协议级别实现保持活动机制。这显然需要您使用的协议定义某种“不做任何事”或“不做任何事”有趣的消息(NOOP、STATUS、PING……诸如此类)。

在(几天前)之前,系统工作得很好。通过使用OnDisconnect event pof TCPServer,它可以实时指示连接何时关闭,但是现在,如果没有任何代码修改,它将无法工作(在3个本地网络上测试)!除了可以在注册表中进行全局配置外,还可以使用为一次一个连接设置它。Indy在IdStackWindows单元中提供了一个包装器,
gwindowstack.SetSocketOption
。未处理来自服务器的“不执行任何操作”消息。我不会使用注册表。当它以前工作时,您是否干净地关闭了连接?TCP确实有一种干净地关闭连接的机制(您应该尽可能使用这种机制)。在这种情况下,会立即检测到断开连接,因为发送了明确的断开连接请求。如果您指的是“重置”按钮,则服务器无法及时检测到。按下该按钮将立即杀死操作系统和内存中的所有内容,使计算机重新进入干净的启动状态。服务器可以检测的唯一方法是通过TCP级别保持有效、协议级别保持有效或超时(服务器端的套接字端点最终将超时并报告错误,但可能不会持续数小时)。如果您需要单独依赖超时,那么您应该实现自己的手动超时。