Delphi:TIdTCPClient 断开连接不关闭连接

时间:2021-05-04 13:47:04

标签: delphi tcp indy delphi-10.1-berlin

我正在调查不断增长的活动 TCP 连接。

似乎 TIdTCPClient.Disconnect 没有关闭连接。

这是一个示例项目

program Project2;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils,
  IdTCPClient;

var
  FClient: TIdTCPClient;
begin
  try
    FClient := TIdTCPClient.Create();
    FClient.Connect('LOCALHOST', 6379);

    FClient.Disconnect;
    FClient.Free;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.

多次打开此控制台应用程序会导致连接增加

netstat -na | find "6379"

enter image description here

旁注:我使用的是 Berlin 10、Windows 7(但在 Windows 10 上相同)

2 个答案:

答案 0 :(得分:6)

Disconnect() 正在关闭连接。 TIME_WAIT 状态是正常的 TCP 行为。

无论哪个对等方首先主动关闭 TCP 连接(在本例中为您的客户端),其套接字端点都会进入 TIME_WAIT 状态,这是 TCP 的一项安全功能丢弃该连接中剩余的任何杂散数据包。一旦 TIME_WAIT 超时,端点将在几分钟后完全释放。

在另一个节点上,被动接收到闭包通知,它的套接字端点改为进入 CLOSE_WAIT 状态,并在闭包变为 ACK 时释放由另一个同行编辑。那边没有 TIME_WAIT

参见 TIME_WAIT and its design implications for protocols and scalable client server systems,它对 TIME_WAIT 是什么、它为什么存在以及如何有效地使用它进行了非常冗长的讨论。

答案 1 :(得分:1)

连接已关闭。 TIME_WAIT 表示本地端点(此端)已关闭连接。

参考:https://superuser.com/questions/173535/what-are-close-wait-and-time-wait-states