Hi,
wäre es möglich Deinen gesamten Code des OnExecute Events des Servers zu posten ?
Ich habe auch schon lange mit den Problem gekämpft, habe aber jetzt keinerlei Probleme!
Man muss nur ein Paar Sachen beachten:
- GANZ GANZ wichtig keine
Exception schlucken, diese müssen zwingend im OnExecute auch auftreten,
ansonsten merkt "die kontrollierende Instanz" von
Indy nicht, das überhaupt ein Fehler aufgetreten ist;
Erst beim nächsten WriteLn/ReadLn
- Bitte füge mal folgenden Code ganz oben im OnExecute ein:
Delphi-Quellcode:
AContext.Connection.IOHandler.CheckForDataOnSource(500);
// millisekunden, nach Bedarf varieren
if not AContext.Connection.Connected
then exit;
if not AContext.Connection.IOHandler.InputBufferIsEmpty
then
begin
// hier Deinen ganz normalen Ablauf implementieren
end
else begin
// Keine Daten im InputBuffer; theoretisch muss nichts gemacht werden; auch kein SLEEP !
//
// hier könnte man gut überprüfen, wann der letzte "Kontakt"/Datenaustausch mit dem Client war
// ist dieser länger her als Dein definierter Timeout, dann einfach etwas in die Connection schreiben
// das kann ein "NOOP" Kommando sein, aber auch ein Kommando auf das der Client gar nicht kennt
// das Schreiben dient nur dazu um wirklich eine Exception auszulösen, die Indy dann handeln kann.
// Bestehend die Connection noch kommt das Kommando normal beim Client an und
//kann behandelt oder ignoriert werden
AContext.connection.Socket.WriteLn('
NOOP');
// oder:
// AContext.connection.Socket.WriteLn('STFU'); // ;-)
end;
- Des Weiteren ist es sehr zu empfehlen, wie auch schon mehrfach vorher erwähnt wurde,
das Protokoll so aufzubauen das es ein "NOOP" Kommando gibt,
ebenso ein "QUIT/EXIT" Kommando
- Ich für meinen Teil gehe immer so wat das ich mit ein TClient-Objekt erstelle und diese in der Eigenschaft
AContext.Data mitführe. Zusätzlich zu den Eigenschaft die das TClient-Objekt definieren,
führe ich immer noch eine Property LastContact oder LastTimeStamp oder whatever mit,
die mir die Information liefert, wann zum letzten mal Erfolgreich Daten gelesen oder geschrieben wurden.
Wenn das alles beherzigt wird, gibt es keinerlei Probleme mit "Zombie" Clients.
Greetz Data
Der Horizont vieler Menschen ist ein Kreis mit Radius Null, und das nennen sie ihren Standpunkt.