gpt4 book ai didi

delphi - idHttpServer(服务器)和 wininet(客户端)上的 TCP Keep Alive

转载 作者:可可西里 更新时间:2023-11-01 02:32:06 28 4
gpt4 key购买 nike

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

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

1 - 实现心跳机制。客户端套接字通知服务器它仍然存在(需要一些工作和一些代码才能使其工作)

2 - TCP Keep Alive .这是我最喜欢的方式,因为它不需要太多的代码和工作。但我对此有一些疑问。

  • 这是否可以与idHttpServer(用于服务器)和wininet 函数(对于客户端)?
  • 这真的像预期的那样有效吗?我的意思是,当客户端一直死机时,服务器会收到通知?
  • 有没有人有在 wininet 上设置这个的示例? (我想这一定是在客户端设置的吧?)
  • 有没有更好的方法通知服务器客户端已死(当然是使用 indy 和 wininet)

编辑

我正在使用 Delphi 2010 和来自他们 svn 的最新 Indy10 源代码。

最佳答案

如果您使用的是最新的 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;

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

否则,直接使用TIdSocketHandle.SetSockOpt()方法手动启用TCP/IP SO_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;

关于delphi - idHttpServer(服务器)和 wininet(客户端)上的 TCP Keep Alive,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5883441/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com