Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Feststellen, dass das LAN-Kabel gezogen wurde (https://www.delphipraxis.net/133290-feststellen-dass-das-lan-kabel-gezogen-wurde.html)

Rainer78 29. Apr 2009 10:40


Feststellen, dass das LAN-Kabel gezogen wurde
 
Hallo zusammen,

ich habe in meinem Programm ein Timing-Problem. Hintergrund ist, dass ich nicht direkt mitbekomme, wenn das LAN-Kabel gezogen wurde bzw. wenn es einen Verbindungsabbruch gibt.

Ich programmiere direkt über Sockets etc. jedoch erhalte ich da erst nach einem Timeout, dass die Verbindung abgebrochen ist.

Windows stellt jedoch direkt fest, wenn die Verbindung nicht mehr besteht (wird ja unten rechts in der TNA angezeigt). Wie kann ich dieses Ereignis abfangen, so dass ich auch so schnell als Möglich auf den Verbindungs-Abbruch reagieren kann ?

Hat da jemand eine Idee ?

mfg.

Rainer

RWarnecke 29. Apr 2009 10:45

Re: Feststellen, dass das LAN-Kabel gezogen wurde
 
Hallo und herzlich willkommen in der DP :dp:

Du könntest es über MSDN-Library durchsuchenGetAdaptersAddresses auslesen. Unter MSDN-Library durchsuchenIP_Adapter_Addresses gibt es den Wert OperStatus. Dieser gibt den Status der Netzwerkkarte zurück.

himitsu 29. Apr 2009 10:46

Re: Feststellen, dass das LAN-Kabel gezogen wurde
 
eine direkte Lösung hätt ich jetzt nicht, aber würde es reichen, wenn du das Timeout einfach runtersetzt/verkürzt?

Rainer78 29. Apr 2009 10:53

Re: Feststellen, dass das LAN-Kabel gezogen wurde
 
Vielen Dank für Eure schnellen Antworten.

Das habe ich auch schon alles ausprobiert, aber es brachte leider nicht den gewünschten Erfolg.

Ich würde gerne von dem Polling weg, also nicht permanent per GetAdapterAdresses etc. abfragen.

Interruptgesteuert, so wie es innerhalb von Windows ja auch zu sein scheint (sonst würde es ja nicht unmittelbar nach dem Trennen der Verbindung in der TNA angezeigt), müsste doch auch irgendwie möglich sein.

Kennt vielleicht jemand das Ereignis / die Windows-Botschaft, auf die hin ich prüfen müsste ?

RWarnecke 29. Apr 2009 11:00

Re: Feststellen, dass das LAN-Kabel gezogen wurde
 
Dann schaue Dir mal den Beitrag an. Da wurde über das Thema schonmal diskutiert.

Kalfany 29. Apr 2009 11:20

Re: Feststellen, dass das LAN-Kabel gezogen wurde
 
Evtl. hilft dir das ja weiter NetworkAvailabilityChanged

Rainer78 29. Apr 2009 11:24

Re: Feststellen, dass das LAN-Kabel gezogen wurde
 
Vielen Dank ... ich schaue mir das mal an. Wird bestimmt etwas dabei sein, dass ich nutzen kann.

Phoenix 29. Apr 2009 12:25

Re: Feststellen, dass das LAN-Kabel gezogen wurde
 
Zitat:

Zitat von Rainer78
Ich programmiere direkt über Sockets etc. jedoch erhalte ich da erst nach einem Timeout, dass die Verbindung abgebrochen ist.

Windows stellt jedoch direkt fest, wenn die Verbindung nicht mehr besteht (wird ja unten rechts in der TNA angezeigt). Wie kann ich dieses Ereignis abfangen, so dass ich auch so schnell als Möglich auf den Verbindungs-Abbruch reagieren kann ?

Das kann nur in Sonderfällen funktionieren. Nimm mal an, Du hast folgende Netzwerk-Struktur:

PC2 <-1-> Switch1 <-2-> Router <-3-> Switch2 <-4-> Hub <-5-> PC2

Mit diesem Event bekommst Du lediglich mit, wenn Kabel 1 (nur an PC1) oder Kabel 5 (nur an PC2) gezogen wird.
Wird Kabel 2, 3 oder 4 gezogen, oder fällt der Router bzw. Switch 2 aus, so bekommst Du den Verbindungsabbruch wieder nur mit einem Timeout mit (wenn überhaupt).

Das bedeutet also, diese Lösung deckt genau einen Sonderfall ab: Die Verbindung zwischen dem PC auf dem diese Software läuft und dem unmittelbar nächsten Netzwerkgerät wird physikalisch getrennt. Alle anderen möglichen Fehlersituationen im Netzwerk (die um längen häufiger und wohl auch wahrscheinlicher sind), fängst Du nicht ab. Lohnt es sich den Aufwand für diesen einen Sonderfall zu treiben?

Ich würde empfehlen, eine logische Quittierung aller übertragenen Daten mit einem eigenen Timeout zu implementieren. Bleibt die Quittung im Zeitraum X aus, ist die Verbindung weg.

Rainer78 29. Apr 2009 12:28

Re: Feststellen, dass das LAN-Kabel gezogen wurde
 
Hallo Phoenix,

danke für das Beispiel. Da habe ich gar nicht dran gedacht.

Phoenix 29. Apr 2009 12:52

Re: Feststellen, dass das LAN-Kabel gezogen wurde
 
Ich hatte letztens ein ähnliches Problem - und bin auch in diese Falle getappt ;-)

Blöderweise sind die TCP Timeouts dazu noch generell sehr großzügig ausgelegt. Wenn Du sendest bekommst Du zwar 'relativ' zügig einen Timeout (Fehler beim Senden, weil nach etlichen Wiederholungen kein TCP-ACK kommt). Wenn Du aber nur empfängst kann es in einem der obigen Szenarien leicht passieren, dass die Applikation gute 2 Stunden auf Daten wartet, nachdem die Verbindung unterbrochen wurde, bis Du einen TCP-Timeout (Fehler beim Empfangen) bekommst.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:06 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