AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Indy TCPServer beenden mit toten Clients
Thema durchsuchen
Ansicht
Themen-Optionen

Indy TCPServer beenden mit toten Clients

Ein Thema von hsg · begonnen am 8. Jun 2012 · letzter Beitrag vom 14. Jun 2012
 
hsg

Registriert seit: 24. Apr 2006
Ort: Wustermark
354 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Indy TCPServer beenden mit toten Clients

  Alt 8. Jun 2012, 13:19
Zitat:
Anders ist es allerdings, wenn der PDA beim Beenden des Servers nicht mehr erreichbar ist. Dann versucht der Server die Verbindung zu beenden, bleibt dabei aber hängen.
klingen als ob nach dem obigen "Writeln" noch etwas vom Server gemacht wird, zum Beispiel auf die Antwort des Clients auf das 'CLOSE_REQUEST@' zu warten. Und das kann natürlich nicht mehr erfolgreich sein wenn der Client nicht da ist. In diesem Fall sollte der Server die dann auftretende Exception (vermutlich ReadTimeOut) eventuell nicht mehr behandeln und Indy automatisch den Thread beenden lassen, wenn ich mich richtig erinnere.
Der ReadTimeOut ist gesetzt (300 sek. habe aber den Server eine viertel Stunde in Ruhe gelassen, er hing immer noch
Die Clients schließen auf die Aufforderung nur die Sockets. Es wird nichts gesendet.
Exception wird ja auch keine geworfen. Zu keinem Zeitpunkt.

Beim IOHandler.Read kann ein TimeOut direkt als Parameter angegeben werden. Der Default ist relativ lange, was wie ein Hänger aussehen kann.

(Send-Timeouts sind plattformspezifisch, nicht als Parameter oder Properties, konfigurierbar und hier anscheinend nicht das Problem)

Hope this helps,
Einzig allein in der OnExecute-Routine wird der Inputbuffer ausgelesen

Delphi-Quellcode:
  if AContext.Connection.IOHandler.InputBufferIsEmpty then
     begin
       SleepEx(10, True);
       Exit;
     end;

  oAnswer := TStringList.Create();

  try
    bTest := True;
    cMess := Trim(AContext.Connection.IOHandler.InputBufferAsString());
    //cMess := Trim(AContext.Connection.IOHandler.ReadLn());

    if cMess = 'then
       begin
         Exit;
       end;
...
es wird also explizit vorher nachgesehen, ob etwas im Puffer steht. Auch kommt er beim Beenden nicht an diese Stelle. Kann somit leider ausgeschlossen werden
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:17 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz