【问题标题】:Delphi: TIdTCPClient disconnect don't close the connectionDelphi:TIdTCPClient断开连接不要关闭连接
【发布时间】:2021-05-04 13:47:04
【问题描述】:

我正在调查活动 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"

旁注:我在 Berlin 10,Windows 7 上(但在 Windows 10 上相同)

【问题讨论】:

    标签: delphi tcp indy delphi-10.1-berlin


    【解决方案1】:

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

    无论哪个节点首先主动关闭 TCP 连接(在本例中为您的客户端),其套接字端点进入 TIME_WAIT 状态,这是 TCP 丢弃任何留在该连接中的杂散数据包。一旦TIME_WAIT 超时,端点将在片刻后完全释放。

    在另一对等点上,被动接收到关闭通知,其套接字端点改为进入CLOSE_WAIT状态,并在关闭被另一方ACKed 时释放同行。那边没有TIME_WAIT

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

    【讨论】:

      【解决方案2】:

      连接已关闭。 TIME_WAIT 表示本地端点(这边)已经关闭了连接。

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

      【讨论】:

      • "对方还没有确认关闭"——这不是TIME_WAIT的意思。见this answer。事实上,你无法进入TIME_WAIT直到对方承认关闭。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多