Mit dem "noch da" ist eine nicht ganz unübliche Methode. Gibt's zum Beispiel auch im
IRC (da heisst es PING und PONG).
Um dir das Leben allerdings etwas leichter zu machen, würde ich wie folgt vorgehen:
Der Server speichert sich zu jedem Client ab:
Delphi-Quellcode:
TClientDataBla =record
lastMessageReceived: integer;
pingSent: integer;
end;
pingSent initialisierst du am Anfang mit 0 oder -1. Jedes mal, wenn vom Client Daten reinkommen, egal, was es ist, sezt du lastMessageReceived auf die aktuelle Zeit (auf die aktuelle Uhrzeit, die aktuelle Programmlaufzeit oder... Du darfst dir was aussuchen, was sich gut eignet).
Dann kannst du mit einem Timer (oder mit einem EventThread oder so) ständig prüfen, wie lange es her ist, dass von dem Client eine Nachricht kam. Ist dies länger als X Sekunden her, dann sendest du den ping-request an den Client und speicherst in pingSent wieder die Zeit ab, bei der du den Request gesendet hast.
Wenn vom Client ein pong kommt, musst du den pingSent natürlich wieder auf den Startwert setzen, der markiert, dass momentan kein ping-request unterwegs ist.
Sollte dein Timer an einem Client angekommen sein, dessen pingSent > 0 ist und wo pingSent länger als Y Sekunden her ist, dann gehst du davon aus, dass die Verbindung draufgegangen ist.
So in etwa sähe dann die Funktion deines Timers aus:
Delphi-Quellcode:
var clientDatas: array of TClientDataBla;
const TIMEOUT =5;
const MAX_REQUEST_TIME_AGE =20;
begin
for i:=0 to length(clientDatas) -1 do
begin
if clientDatas[i].pingSent > 0 then
begin
if zeitdifferenz(clientDatas[i].pingSent, now()) > TIMEOUT then verbindungPlattmachen(i);
end
else
begin
if zeitdifferenz(clientDatas[i].lastMessageReceived, now()) > MAX_REQUEST_TIME_AGE then sendePingRequest(i);
end;
end;
end;
Letzter Tipp: Drogen. Machen zwar nicht glücklich, geben einem aber wenigstens das Gefühl glücklich zu sein.
Have a lot of fun!