2

Delphi 2007 に同梱されている Indy 10.1.1 コンポーネントを使用して、着信 TCP リクエストをリッスンするアプリケーションがあります。

時折、クライアント アプリケーション以外からの着信接続を受け取ります。通常、次の 2 つのいずれかが発生します。1) データが受信される前にクライアントによって接続が終了されるか、2) 予期しないデータが受信され、手動で接続が終了されます。

ただし、データが受信されず、クライアントが接続を終了するまで持続するように見える接続を受信しました。

指定された時間が経過してもデータが受信されない場合、サーバーからのそのような接続を終了する方法はありますか?

4

4 に答える 4

3

OnExecute イベント ハンドラーで、最後に正常なデータがクライアントから受信された時刻を追跡します。接続の ReadTimeout プロパティを使用すると、保留中の読み取り操作を定期的にタイムアウトできるため、クライアントがしばらくデータを送信していないかどうかを確認し、送信していない場合は切断できます。

于 2010-03-04T02:52:39.140 に答える
1

これを killthread.pas として保存します

unit killthread;

interface

uses
  Classes, IdTCPServer, IdTCPClient, IdContext, Types, SyncObjs;

type
  TKillThread = class(TThread)
  private
    FContext: TIdContext;
    FInterval: DWORD;
    FEvent: TEvent;
  protected
    procedure Execute; override;
  public
    constructor Create(AContext: TIdContext; AInterval: DWORD); overload;
    destructor Destroy; override;
    procedure Reset;
    procedure Stop;
  end;

implementation

{ TKillThread }

constructor TKillThread.Create(AContext: TIdContext; AInterval: DWORD);
begin
  FContext := AContext;
  FInterval := AInterval;
  FEvent := TEvent.Create(nil, False, False, '');
  inherited Create(False);
end;

destructor TKillThread.Destroy;
begin
  FEvent.Free;
  inherited Destroy;
end;

procedure TKillThread.Reset;
begin
  FEvent.SetEvent;
end;

procedure TKillThread.Stop;
begin
  Terminate;
  FEvent.SetEvent;
  WaitFor;
end;

procedure TKillThread.Execute;
begin
  while not Terminated do
  begin
    if FEvent.WaitFor(FInterval) = wrTimeout then
    begin
      FContext.Connection.Disconnect;
      Exit;
    end;
  end;
end;

end.

次に、サーバー側でこれを行います。

procedure TYourTCPServer.OnConnect(AContext: TIdContext);
begin
  AContext.Data := TKillThread.Create(AContext, 120000);
end;

procedure TYourTCPServer.OnDisconnect(AContext: TIdContext);
begin
  TKillThread(AContext.Data).Stop;
end;

procedure TYourTCPServer.OnExecute(AContext: TIdContext);
begin
  if AContext.Connection.Connected then
  begin
    TKillThread(AContext.Data).Reset;
    // your code here
  end;
end;
于 2010-03-04T17:49:44.917 に答える
1

同様の問題があります。delphi7 + Indy9を使用しました。

そして私の解決策:TIdTCPServerイベントonConnectで、私はこれが好きです

procedure Tf_main.ServerHostConnect(AThread: TIdPeerThread);
begin
  //code something

  //mean AThread will do Disconnected  if Client no activity ( send receive ) on interval...) 
  AThread.Connection.ReadTimeout := 300000;  //5 minutes..

  //code something
end;

おそらくIndy10では、そのように似たことができます

于 2010-05-08T16:27:27.790 に答える
0

を呼び出すことができるはずです(TIdTCPConnection).Disconnect

于 2010-03-04T02:12:19.790 に答える