5

idHttpServer を使用して開発された Web サーバー アプリケーションがあります。クライアントが Web サーバーに接続したときに、なんらかの理由で切断された (正常な切断ではない) と、Web サーバーに通知されません。これが通常の動作であることはわかっていますが、クライアントがいつ死ぬかを知る必要があります。

これにはいくつかの方法があります。私は2つの良い方法を知っています:

1 - ハートビート メカニズムを実装します。クライアントソケットは、サーバーがまだ生きていることを通知します (動作させるには、いくつかの作業とコードが必要です)。

2 - TCP キープアライブ。これは、あまり多くのコードや作業を必要としないため、私が最も気に入っている方法です。しかし、これに関していくつか質問がありました。

  • これは idHttpServer (サーバー用) と wininet 関数 (クライアント用) で使用できますか?
  • それは本当に期待どおりに機能しますか?つまり、クライアントが常に停止すると、サーバーに通知されますか?
  • wininetでこれを設定するサンプルはありますか? (これはクライアント側で設定する必要があると思いますよね?)
  • クライアントが死んでいることをサーバーに通知するより良い方法はありますか (もちろん indy と wininet を使用)

編集

Delphi 2010 と svn の最後の Indy10 ソース コードを使用しています。

4

1 に答える 1

4

最新のIndy10リリースを使用している場合は、次のTIdSocketHandle.SetKeepAliveValues()方法を使用できます。

procedure SetKeepAliveValues(const AEnabled: Boolean; const ATimeMS, AInterval: Integer);

例えば:

procedure TForm1.IdHTTPServer1Connect(AContext: TIdContext);
begin
  // send a keep-alive every 1 second after
  // 5 seconds of inactivity has been detected
  AContext.Binding.SetKeepAliveValues(True, 5000, 1000);
end;

ATimeMSおよびAIntervalパラメータは、Win2K以降でのみサポートされていることに注意してください。

それ以外の場合は、このTIdSocketHandle.SetSockOpt()方法を直接使用して、TCP/IPSO_KEEPALIVEオプションを手動で有効にします。

procedure TIdSocketHandle.SetSockOpt(ALevel: TIdSocketOptionLevel; AOptName: TIdSocketOption; AOptVal: Integer);

例えば:

procedure TForm1.IdHTTPServer1Connect(AContext: TIdContext);
begin
  AContext.Binding.SetSockOpt(Id_SOL_SOCKET, Id_SO_KEEPALIVE, 1);
end;
于 2011-05-05T06:21:58.613 に答える