LNet "Lost connection" erkennen

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
DL3AD
Beiträge: 453
Registriert: Fr 13. Sep 2013, 12:07
OS, Lazarus, FPC: Debian Buster (L 2.0.2)
CPU-Target: 64Bit
Wohnort: Rügen

LNet "Lost connection" erkennen

Beitrag von DL3AD »

Hallo,
bin gerade dabei mein Projekt gegen diverse Einflüsse abzusichern.
Habe u.a. eine TCP Verbindung über LNet und möchte eine "Lost connection" erkennen - Client und Serverseitig.
D.h. ich trenne die Netzwerkverbindung durch Stecker ziehen und möchte das erkennen.
Wie kann man das abfangen ?

Frank

sstvmaster
Beiträge: 453
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.0.12
CPU-Target: 32+64bit
Wohnort: Dresden

Re: LNet "Lost connection" erkennen

Beitrag von sstvmaster »

Hallo Frank,

unter Windows kannst du folgendes nutzen. Gilt aber nur wenn das Kabel abgezogen wird oder das WLan Modul deaktiviert wird.

Code: Alles auswählen

program Project1;

uses
  WinInet;

var
  origin: cardinal;

begin
  WriteLn(InternetGetConnectedState(@origin,0));

  ReadLn;
end. 
Ansonst einen Ping wohin und auswerten.

Oder du baust dir eine "Heartbeat" ein, der halt schaut ob der Server/Client noch da ist.
Der Server/Client trägt die empfangenen Heartbeats in einer Liste ein und schaut alle x sekunden
nach ob der Server/Client noch da ist.

LG Maik
Windows 10, Lazarus 2.0.12 + Lazarus Trunk
LG Maik

Benutzeravatar
theo
Beiträge: 8654
Registriert: Mo 11. Sep 2006, 19:01

Re: LNet "Lost connection" erkennen

Beitrag von theo »

Der Autor von Synapse hatte zu dem Thema mal etwas geschrieben;
http://www.ararat.cz/synapse/doku.php/p ... connection

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 4609
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: LNet "Lost connection" erkennen

Beitrag von af0815 »

Das Erkennen des Zustandes ist nicht einfach. Es hängt auch sehr stark, vom BS und der Implentierung der Sockets aus BS ab.

Ich bin dem begegnet bei der Kontrolle der Verbindung zu DB-Servern über schlechte Verbindungen. Manche Implementierungen geben dir keine vernünftige Fehlermeldung retour. Das sind manchmal TimeOuts von bis zu 2 Min. drinnen. Die beste Erfahrung habe ich immer noch mit dem guten alten Ping gemacht, wenn der über die Strecke zulässig ist (Firewalls blocken das oft). Ich mache dann immer wieder einen Ping, bevor ich die Verbindung wieder aufbaue.

Wenn man beide Seiten programmiert, so ist ein 'Alive' sinnvoll. Wenn der fehlt, ist die Verbindung tot, auch wenn der Socket noch nicht einen Fehler gemeldet hat. Das dauert oft, oder bringt eine Fehlermeldung aus der Bibliothek, die man überhaupt nicht braucht (bei Headless Systemen).

Bei Linux muss man seine Rechte so setzen, das man den Ping überhaupt als User absetzen kann.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten