Laestiger Timeout beim Zugriff auf nicht (mehr) verfuegbare Netzwerkfreigaben

13/03/2011 - 00:27 von Michael Landenberger | Report spam
Hallo,

es gibt bekanntlich viele Programme, mit denen man u. a. Dateien und Ordner
auf anderen Rechnern im Netzwerk zugreifen kann. Manche dieser Programme
speichern auch den zuletzt benutzten Pfad, um dann z. B. einen "Datei
öffnen"-Dialog spàter wieder mit eben diesem Pfad zu initialisieren.

Nun kann es aber vorkommen, dass die zuletzt geöffnete Netzwerkfreigabe
nicht mehr zur Verfügung steht, z. B. weil der Host mittlerweile offline
ist. Leider dauert es aber sehr lang, bis Windows das mitbekommt. Manche
Programme (darunter sogar der Windows Explorer, aber auch Firefox u. a.)
frieren wàhrend des Zugriffsversuchs ein und sind nur noch eingeschrànkt
oder gar nicht mehr benutzbar. Wenn der Zugriff automatisch erfolgt, kann
der Benutzer den vergeblichen Zugriff nicht verhindern, d. h. es bleibt ihm
nichts anderes übrig als zu warten, bis Windows endlich gemerkt hat, dass
eine Netzwerkressource nicht mehr verfügbar ist. Das kann manchmal bis zu
einer Minute dauern und ist ausgesprochen làstig.

Nun bin ich gerade dabei, ein eigenes Programm zu schreiben, welches
ebenfalls auf Netzwerkfreigaben zugreift. Allerdings soll dieses Programm
schneller reagieren, wenn eine Ressource nicht (mehr) verfügbar ist. Ich
habe festgestellt, dass das mit den Standard-Routinen, die das Windows API
für den Dateizugriff über UNC-Pfade bereitstellt, nicht realisierbar ist
(falls jemand einen Tipp hat, wie es doch geht, wàre ich dankbar). Ich bin
daher auf die Idee gekommen, den betreffenden Host vor dem eigentlichen
Dateizugriff erst einmal anzupingen. Wenn der Host auf Pings nicht reagiert,
betrachte ich ihn als offline und versuche gar nicht erst, darauf
zuzugreifen.

Mein Programm schickt also vor jedem Dateizugriff auf UNC-Pfade á la
\\host\ordner\datei zunàchst einen ICMP-Ping an den Host. Das
Zeitaufwendigste dabei ist die Namensauflösung. Kann der Hostname nicht
aufgelöst werden, liefert die Namensauflösung schon nach wenigen Sekunden
eine entsprechende Rückmeldung. Diese nimmt mein Programm zum Anlass, jeden
weiteren Zugriffsversuch zu unterlassen, womit vermieden wird, dass es durch
den ewig langen Timeout bei Dateizugriffen blockiert wird. Klappt die
Namensauflösung jedoch, wird als nàchstes ein ICMP-Ping an die ermittelte IP
geschickt. Wenn der Ping ins Leere làuft, wird das ebenfalls als Indiz für
einen nicht erreichbaren Host gewertet. Nur wenn der Host auf den Ping
antwortet, wird tatsàchlich auf die Netzwerkressource zugegriffen.

Für den Ping habe ich derzeit einen Timeout von 100 ms eingestellt, was für
LAN-Zugriffe vollkommen ausreichen sollte. Die ganze Prüfung incl.
Namensauflösung und Ping dauert also maximal einige Sekunden. Danach weiß
mein Programm, ob eine Netzwerkressource verfügbar ist oder nicht, und
verhàlt sich entsprechend. Im Gegensatz dazu dauert es bei einem regulàren
Dateizugriff manchmal bis zu einer Minute, bis Windows mitbekommt, dass der
Host offline ist. In dieser Zeit "hàngt" nicht nur mein Programm, sondern
jedes Programm, das Standard-API-Funktionen für Dateizugriffe im Netzwerk
verwendet.

Lange Rede, kurzer Sinn: die Sache funktioniert bisher perfekt. Nun würde
ich gerne von den Netzwerkexperten wissen, ob irgend etwas gegen diese
Vorgehensweise spricht. Es geht *ausschließlich* um LAN-Zugriffe, und ich
kann ausschließen, dass ICMP Ping Requests geblockt werden.

Beteiligte Betriebssysteme: Windows XP, Vista, Windows 7.

Gruß

Michael
 

Lesen sie die antworten

#1 Heiko Nocon
13/03/2011 - 03:02 | Warnen spam
Michael Landenberger wrote:

Leider dauert es aber sehr lang, bis Windows das mitbekommt.



Man kann diesen Timeout beliebig beinflussen.

Manche
Programme (darunter sogar der Windows Explorer, aber auch Firefox u. a.)
frieren wàhrend des Zugriffsversuchs ein und sind nur noch eingeschrànkt
oder gar nicht mehr benutzbar.



Tja, gegen dumme Programmierer ist leider kein Kraut gewachsen. Wenn man
potentiell langdauernde Operationen im Haupthread behandelt, kann der
nicht gleichzeitig das GUI behandeln, wenn sie mal wirklich lange
dauern.

Nun bin ich gerade dabei, ein eigenes Programm zu schreiben, welches
ebenfalls auf Netzwerkfreigaben zugreift. Allerdings soll dieses Programm
schneller reagieren, wenn eine Ressource nicht (mehr) verfügbar ist. Ich
habe festgestellt, dass das mit den Standard-Routinen, die das Windows API
für den Dateizugriff über UNC-Pfade bereitstellt, nicht realisierbar ist
(falls jemand einen Tipp hat, wie es doch geht, wàre ich dankbar).



Die Einstellung ist global. Man kann aber auch ohne Änderung dieser
Einstellung Programme schreiben, die nicht "hàngen", wenn der Zugriff
mal lànger dauert oder nach dem Standard-Timeout ganz scheitert. Einfach
indem man das GUI von der Netzwerkgeschichte entkoppelt, indem man
getrennte Threads dafür verwendet.

Ich bin
daher auf die Idee gekommen, den betreffenden Host vor dem eigentlichen
Dateizugriff erst einmal anzupingen.



Schwachsinnige Idee, die nur an Symptomen rumdoktort. Beispiel: Ping
super, aber SMB unmöglich, weil halt der Paketfilter des Servers ICMP
Echo zulàßt, aber keine SMB-Kommunikation. Oder: Ping klappt gerade
noch, aber in diesem Moment wird der Server gerade runtergefahren. Die
Zahl möglicher Gegen-Szenarios làßt sich beliebig fortsetzen...

Ähnliche fragen