【发布时间】:2019-07-05 01:38:04
【问题描述】:
我在 Delphi 程序中使用 Indy telnet 客户端组件。 现在我需要捕获 telnet 断开连接(例如,当其他一些程序连接到同一主机时,我的连接中断了)。 怎么抓?
【问题讨论】:
-
要检查连接是否仍然可写,您可以从客户端发送 NOP 命令(参见 RFC 854 tools.ietf.org/html/rfc854)
我在 Delphi 程序中使用 Indy telnet 客户端组件。 现在我需要捕获 telnet 断开连接(例如,当其他一些程序连接到同一主机时,我的连接中断了)。 怎么抓?
【问题讨论】:
您可以使用OnStatus 事件,检查hsDisconnected 状态。
此时,TIdTelnet 在连接意外关闭时不会触发OnDisconnect 或OnStatus 事件。这是一个已知问题,在 Indy 的问题跟踪器中有一个未解决的问题:
#118: TIdTelnet needs to trigger OnDisconnect or OnStatus when disconnected
在解决此问题之前,您必须修改TIdTelnet 的源代码以挂钩到其内部读取线程,或者至少为其分配OnTerminate 处理程序,以检测它何时停止运行。
【讨论】:
OnStatus 事件期间,连接是否正常关闭或异常丢失。如果不是,我将不得不调查一下
procedure TForm1.IdTelnet1Status(ASender: TObject; const AStatus: TIdStatus; const AStatusText: string); begin if AStatus = hsDisconnected then Begin try if idtelnet1.Connected = False then idtelnet1.Connect except end;结束;没有反应