Einzelnen Beitrag anzeigen

Benutzerbild von yankee
yankee

Registriert seit: 10. Mär 2004
1.134 Beiträge
 
Lazarus
 
#5

Re: Alive vom Server aus. Server "Client noch da"

  Alt 4. Jul 2008, 10:47
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!
  Mit Zitat antworten Zitat