I have a webserver application developed using idHttpServer. When a client connects do my webserver and, for some unknown reason, got disconnect (not a gracefully disconnect) my webserver does not get notified. I know this is the normal behavior but I need to know when the client dies.
There are a few ways of doing this. I know 2 good ways:
1 - Implement a heart beat mechanism. The client socket notifies the server that it is still alive (need some work and some code to make it works)
2 - TCP Keep Alive. This is the way I like most because it requires not too much code and work. But I got a few questions regarding this.
EDIT
I am using Delphi 2010 and last Indy10 source code from their svn.
If you are using an up-to-date Indy 10 release, then you can use the TIdSocketHandle.SetKeepAliveValues()
method:
procedure SetKeepAliveValues(const AEnabled: Boolean; const ATimeMS, AInterval: Integer);
For example:
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;
Note that the ATimeMS
and AInterval
parameters are only supported on Win2K and later.
Otherwise, use the TIdSocketHandle.SetSockOpt()
method directly to enable the TCP/IP SO_KEEPALIVE
option manually:
procedure TIdSocketHandle.SetSockOpt(ALevel: TIdSocketOptionLevel; AOptName: TIdSocketOption; AOptVal: Integer);
For example:
procedure TForm1.IdHTTPServer1Connect(AContext: TIdContext);
begin
AContext.Binding.SetSockOpt(Id_SOL_SOCKET, Id_SO_KEEPALIVE, 1);
end;
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With