AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Feststellen, dass das LAN-Kabel gezogen wurde
Thema durchsuchen
Ansicht
Themen-Optionen

Feststellen, dass das LAN-Kabel gezogen wurde

Ein Thema von Rainer78 · begonnen am 29. Apr 2009 · letzter Beitrag vom 29. Apr 2009
Antwort Antwort
Rainer78

Registriert seit: 3. Sep 2008
20 Beiträge
 
Delphi 2005 Professional
 
#1

Feststellen, dass das LAN-Kabel gezogen wurde

  Alt 29. Apr 2009, 11:40
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
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#2

Re: Feststellen, dass das LAN-Kabel gezogen wurde

  Alt 29. Apr 2009, 11:45
Hallo und herzlich willkommen in der 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.
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

Re: Feststellen, dass das LAN-Kabel gezogen wurde

  Alt 29. Apr 2009, 11:46
eine direkte Lösung hätt ich jetzt nicht, aber würde es reichen, wenn du das Timeout einfach runtersetzt/verkürzt?
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Rainer78

Registriert seit: 3. Sep 2008
20 Beiträge
 
Delphi 2005 Professional
 
#4

Re: Feststellen, dass das LAN-Kabel gezogen wurde

  Alt 29. Apr 2009, 11:53
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 ?
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#5

Re: Feststellen, dass das LAN-Kabel gezogen wurde

  Alt 29. Apr 2009, 12:00
Dann schaue Dir mal den Beitrag an. Da wurde über das Thema schonmal diskutiert.
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
Kalfany

Registriert seit: 28. Feb 2008
Ort: München
153 Beiträge
 
Delphi 2007 Professional
 
#6

Re: Feststellen, dass das LAN-Kabel gezogen wurde

  Alt 29. Apr 2009, 12:20
Evtl. hilft dir das ja weiter NetworkAvailabilityChanged
  Mit Zitat antworten Zitat
Rainer78

Registriert seit: 3. Sep 2008
20 Beiträge
 
Delphi 2005 Professional
 
#7

Re: Feststellen, dass das LAN-Kabel gezogen wurde

  Alt 29. Apr 2009, 12:24
Vielen Dank ... ich schaue mir das mal an. Wird bestimmt etwas dabei sein, dass ich nutzen kann.
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.639 Beiträge
 
#8

Re: Feststellen, dass das LAN-Kabel gezogen wurde

  Alt 29. Apr 2009, 13:25
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.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Rainer78

Registriert seit: 3. Sep 2008
20 Beiträge
 
Delphi 2005 Professional
 
#9

Re: Feststellen, dass das LAN-Kabel gezogen wurde

  Alt 29. Apr 2009, 13:28
Hallo Phoenix,

danke für das Beispiel. Da habe ich gar nicht dran gedacht.
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.639 Beiträge
 
#10

Re: Feststellen, dass das LAN-Kabel gezogen wurde

  Alt 29. Apr 2009, 13:52
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.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  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 21:21 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz