5

我有一个使用 idHttpServer 开发的网络服务器应用程序。当客户端连接我的网络服务器时,由于某种未知原因,断开连接(不是正常断开连接),我的网络服务器没有收到通知。我知道这是正常行为,但我需要知道客户何时死亡。

有几种方法可以做到这一点。我知道两个好方法:

1 - 实施心跳机制。客户端套接字通知服务器它还活着(需要一些工作和一些代码才能使其工作)

2 - TCP 保持活跃。这是我最喜欢的方式,因为它不需要太多的代码和工作。但我有几个关于这个的问题。

  • 这可以与 idHttpServer (用于服务器)和 wininet 功能(用于客户端)一起使用吗?
  • 这真的按预期工作吗?我的意思是,当客户端总是死机时,服务器会收到通知?
  • 有没有人有一个在wininet上设置的样本?(我想这必须在客户端设置,对吧?)
  • 有没有更好的方法来通知服务器客户端已死(当然使用 indy 和 wininet)

编辑

我正在使用 Delphi 2010 和他们 svn 中的最后一个 Indy10 源代码。

4

1 回答 1

4

如果您使用的是最新的 Indy 10 版本,则可以使用以下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;

请注意,ATimeMSandAInterval参数仅在 Win2K 及更高版本上受支持。

否则,TIdSocketHandle.SetSockOpt()直接使用该方法SO_KEEPALIVE手动启用 TCP/IP 选项:

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 回答