AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Indy TCPClient Connection Status
Thema durchsuchen
Ansicht
Themen-Optionen

Indy TCPClient Connection Status

Ein Thema von Delphi-Narr · begonnen am 19. Mär 2015 · letzter Beitrag vom 25. Mär 2015
Antwort Antwort
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.372 Beiträge
 
Delphi 12 Athens
 
#1

AW: Indy TCPClient Connection Status

  Alt 19. Mär 2015, 10:48
Zitat:
Konsolenanwendung ...
Wenn die komponenten mit Messages arbeiten, dann mußt du auch Messages verarbeiten (die VCL macht das konstruktionsbegingt automaisch), sonst kann da schnell einiges nicht (richtig) funktionieren.



PS: Bei Verbindungsabbrüchen kann es sein, daß Connected noch lange True liefert.
Der einzige sichere Weg eine Verbindung zu prüfen, ist etwas zu senden und auf die Antwort zu warten.
(Connected=False ist dagegen natürlich immer Disconnected)
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (19. Mär 2015 um 10:50 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Delphi-Narr
Delphi-Narr

Registriert seit: 29. Aug 2009
Ort: Duisburg
437 Beiträge
 
Delphi 2007 Professional
 
#2

AW: Indy TCPClient Connection Status

  Alt 19. Mär 2015, 10:56
Ah, ja das hatte ich mir schon gedacht. Unter Lazarus habe ich das ganze aber nicht hinbekommen, da alles, was ich dazu gefunden habe auf Windows Bibliotheken basiert.
Ich müsste also in der Loop die Messages manuell abfragen, wie könnte das unter Linux denn gehen?

Wenn connected noch true liefert, schickt der Client die Daten an den Server und erhält eine Bestätigung. Aber selbst, wenn die Daten verloren gehen und erst nach 10 Sekunden neu geschickt würden, wenn der Client mitbekommen hat, dass die Verbindung tot ist, wäre kein Problem (An der Hardware-Konfiguration ändert sich ja nicht so viel )

Alle 30 Sekunden tauschen Server und Client auch unabhängig voneinander Keep-Alive-Meldungen aus und trennen die Verbindung, wenn die nicht ankommen.
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.010 Beiträge
 
Delphi 2009 Professional
 
#3

AW: Indy TCPClient Connection Status

  Alt 19. Mär 2015, 11:13
Ich müsste also in der Loop die Messages manuell abfragen, wie könnte das unter Linux denn gehen?
Indy verwendet keine Windows Messages - daher war ist es leichter auf andere Betriebssystem portierbar. Der Fehler muss also woanders liegen.

Ich würde mal einen Client auf dem gleichen Linux System laufen lassen um zu testen, ob er sich auch ständig neu verbindet.

Und auch mit netstat mal schauen ob und wielange der Serverport geöffnet ist.
Michael Justin
  Mit Zitat antworten Zitat
Benutzerbild von Delphi-Narr
Delphi-Narr

Registriert seit: 29. Aug 2009
Ort: Duisburg
437 Beiträge
 
Delphi 2007 Professional
 
#4

AW: Indy TCPClient Connection Status

  Alt 20. Mär 2015, 10:31
Der Client ist in diesem Fall nicht Linux kompatibel und lässt sich auch nicht so leicht portieren...

Laut nmap mit watch ist der Port die ganze Zeit offen. Ich denke, dass der Client die "connected"-Abfrage immer zu false auswertet... Eine Disconnect Fehlermeldung kommt nicht, nur alle paar Sekunden die Verbunden-Meldung.
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.010 Beiträge
 
Delphi 2009 Professional
 
#5

AW: Indy TCPClient Connection Status

  Alt 20. Mär 2015, 10:54
Ich denke, dass der Client die "connected"-Abfrage immer zu false auswertet
Was ein Argument dafür ist, sie wegzulassen

In meinen Indy-basierten Clients benutze ich heart-beat Nachrichten um den Verbindungsstatus zu prüfen. Ob die Verbindung noch besteht läßt sich dadurch prüfen, dass man versucht Daten zu empfangen (IOHandler.Readxxx) oder zu senden (IOHandler.Writexxx). Falls dann eine Exception auftritt, verwirft der Client die Verbindung, und versucht sie wiederherzustellen, am sichersten indem auch eine neue Instanz der TIdTCPClient Klasse erzeugt wird.
Michael Justin
  Mit Zitat antworten Zitat
Benutzerbild von Delphi-Narr
Delphi-Narr

Registriert seit: 29. Aug 2009
Ort: Duisburg
437 Beiträge
 
Delphi 2007 Professional
 
#6

AW: Indy TCPClient Connection Status

  Alt 20. Mär 2015, 11:01
Ja das werde ich wohl tun
Heartbeats werden auch verschickt, nur nicht so oft. Das werde ich dann mal anpassen.
Komisch, dass das bei Windows-"interner" Kommunikation die Abfrage das richtige Resultat lieferte.
  Mit Zitat antworten Zitat
Benutzerbild von Delphi-Narr
Delphi-Narr

Registriert seit: 29. Aug 2009
Ort: Duisburg
437 Beiträge
 
Delphi 2007 Professional
 
#7

AW: Indy TCPClient Connection Status

  Alt 24. Mär 2015, 10:55
Habe hierzu nochmal eine Frage:
Ich habe jetzt den Heartbeat eingebaut, der Client schickt in einem Intervall die Heartbeats und der Server antwortet.
In der ContextClass des Servers werden die MacAdresse und der Zeitpunkt des letzten Heartbeats des Clients gespeichert. In festen Intervallen räumt der Server dann auf, d.h. er durchläuft die Liste der verbundenen Clients und alle, die zu lange keinen Heartbeat mehr hatten, werden disconnected - zumindest in der Theorie.
Der Client erkennt inzwischen korrekt, ob er keine Verbindung mehr hat, der Server vom Prinzip her auch.

Delphi-Quellcode:
procedure TMyServer.HeartbeatCheck();
var
    ContextList:TList;
    Context:TIdContext;
    i:integer;
begin
    ContextList := TCPServer.Contexts.LockList;
    try
       for i := 0 to ContextList.Count-1 do
           begin
                Context := TIdContext(ContextList.Items[i]);
                if (IncSecond(TClientIdentifier(Context).Heartbeat, CLIENTTIMEOUT) < Now) and (TClientIdentifier(Context).Heartbeat <> 0) then
                   begin
                        Log('Client '+TClientIdentifier(Context).Mac+' timed out', ltE);
                        TIdContext(ContextList.items[i]).Connection.IOHandler.close;
                        TIdContext(ContextList.items[i]).Connection.Disconnect();
                   end;
           end;
     finally
        TCPServer.Contexts.UnlockList;
     end;
end;
Wenn ein Client die Verbindung verliert, wird das entsprechend geloggt, doch in JEDEM Durchlauf wird er erneut als timed out erkannt - dabei sollte er ja eigentlich aus der Liste gelöscht werden?!
Und auch wenn der Client die Verbindung wieder aufnimmt und Heartbeats schickt, wird er dennoch wieder getrennt.
Im OnDisconnect des Servers wird eigentlich ebenfalls geloggt, dass ein bestimmter Client die Verbindung getrennt hat - dies wird in der Heartbeat Methode aber offenbar gar nicht ausgelöst. Vielleicht ist es ja nur ein ganz einfacher blöder Fehler

Viele Grüße!
  Mit Zitat antworten Zitat
Antwort Antwort


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 03:39 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