Wie Netzwerkzugang schnell und ohne Timeout prüfen?

halwe

Lt. Commander
Registriert
Jan. 2007
Beiträge
1.935
Hallo zusammen,

ich nutze ein kleines Netzwerk, neben meinem Windows 7 PC steht da noch ein Windows 10 PC sowie ein NAS, außerdem sind zwei Drucker und die Smartphones über den Fritz Router eingebunden.
Die Netzwerkverbindungen sind schnell und performant (z. B. bis zu 100 MByte/s beim NAS über das GBit LAN.

Auch der Zugang zum Windows 10 PC läuft gut, wenn der an ist.
Nun ist der aber auch oft aus und für meine lokalen Skripte (AHK) ist das eine wichtige Information. Ich muss also ab und zu nachschauen, ob dieser PC am Netzwerk ist. Dazu kann ich eine der Freigaben des Windows 10 PC aufrufen.

Ist der nun ausgeschaltet und ich rufe im Windows Explorer eine Freigabe auf, so dauert es sehr lange, bis ein Timeout sich mit einer qualifizierten Fehlermeldung meldet (ca. 100s). Während dieser Zeit sind andere Prozesse auf dem aufrufenden Windows 7 PC sehr verlangsamt. Das aufrufende Explorerfenster lässt sich während des Wartens auch nur "gewaltsam" schließen,
Dies stört meine Arbeit erheblich, da meine Skripte öfter mal Entscheidungen fällen müssen, abhängig davon, ob der andere PC im Netz ist.

Aktuell nutze ich einen Workaround, bei dem in einem Nebenprozess der Aufruf der Netzwerkadresse erfolgt und wenn nicht nach 500ms ein positives Ergebnis da ist wird festgestellt, dass der Win10-PC aus ist. Auch das funktioniert, ändert aber nichts daran, dass der Nebenprozess für einige Zeit das ganzes System verlangsamt.

Meine Frage ist also, wie ich dieses Timeout verkürzen kann. Bzw. ob es einen Weg gibt, schneller und ohne große Systembelastung festzustellen, ob der Rechner an ist. Hinsichtlich des Routers, der diese Info ja hat, kenne ich leider keine entsprechenden Befehle zum Statusabruf.

Eventuell käme noch ein ping in Frage, aber dessen Auswertung (Schreiben Ergebnis in Datei, Abwarten bis Datei da ist) ist für mich deutlich schwerer auszuwerten als die Existenz einer Netzwerksdatei, deshalb will ich hier vorher anfragen, ob es einfachere Wege gibt, das Timeout zu vermeiden.

Viele Grüße, Halwe
 
Ein ping braucht praktisch keine Systemressourcen, kann non-blocking sein. Da ist nix mit in Datei. popen z.B.
Womit schreibst du deine Skripte?
 
Vielen Dank HominiLupus fürs schnelle Lesen, Mitdenken und die prompte Reaktion.

Ping also?
Ich schreibe meine Scripte mit AHK. Da hatte ich auch schon mal so eine ping-Auswertung gebastelt, also einen Aufruf wie
Code:
ping -n 1 <IP-Adresse> >temp.txt
mit anschließender Auswertung der temp.txt nach dem Fehlertext.
Ja, das geht grundsätzlich und ja, das kostet weniger Ressourcen.
Scheint mir aber auch ein umständlicher Weg zu sein, da ich auch hier nicht bis zum (negativen) Ergebnis warten will, sondern schneller ein nicht rechtzeitig eintreffendes positives Ergebnis auswerte.
Leider krieg ich mit AHK als Fehlerwert (ErrorLevel) immer 0, da dort nur das Ergebnis des Programmaufrufs "Ping" vermerkt wird, nicht das "inhaltliche" Ergebnis.

Viele Grüße, Halwe
 
Vielen Dank Backfisch für den Link!
Ich nutze zwar noch das alte AHK, aber eine ISMP-Bibliothek konnte ich auf meinem PC unter Windows\winsxs finden. Von daher könnte die AHK-library funktionieren und wäre wohl gegenüber dem profanen PING.EXE und seiner Auswertung ein deutlicher Fortschritt :)
 
ping -n 1 -w 1000 192.168....

Damit sagst du ping, dass maximal 1000 ms gewartet werden soll bevor ein timeout festgestellt wird. Standard ist 4000 ms, also 4 Sekunden. Je nachdem wie schnell du es haben willst, kannst du den Timeout niedriger einstellen. Bedenke aber, dass im worst case auch Fehler passieren können, wenn du zB 5 ms einstellst und aus irgendwelchen Gründen der Ping 6 ms braucht. In dem Fall würde der Ping fehlschlagen obwohl der PC eigentlich online ist.

Wenn ein Ping im Skript blockiert, dann kannst du ihn entweder nicht-blockierend aufrufen oder in einem separaten Thread. Alternativ als eigenständiges Skript im Hintergrund, das zB alle 10 Sekunden einen Ping macht (zB über den Taskplaner eine ping.bat aufrufen) und zB eine Umgebungsvariable setzt oder eine leere Datei erstellt bzw. löscht zB "server.up". In deinem Skript musst du dann nur die Variable bzw. die Datei abfragen und kannst ohne Verzögerung weitermachen.

Ich hab leider keine Ahnung was "AHK" ist, daher kann ich auch nicht beurteilen ob das möglich ist bzw. wie.



*edit
Weitere Möglichkeit: Mit "net use" kannst du dir die verbundenen Netzlaufwerke anzeigen lassen. Da steht dann auch der Status (zB Disconnected). Klar, die Ausgabe muss auch auf Textbasis ausgewertet werden, aber Windows ist nun mal etwas störrisch bei Netzlaufwerken - es wird nach dem Laufwerk gesucht und gesucht und gesucht und...
 
Zuletzt bearbeitet:
@thebackfisch: Leider klappt das mit der AHK-Bibliothek nun doch nicht so einfach. Ich arbeite noch mit dem alten AHK (also nicht mit "Autohotkey_L") und irgendwie komme ich mit dem Skript auf Echo-Fehler. Versteh leider auch zu wenig von DLL-Aufrufen, um dem auf den Grund zu gehen.
Weiß nun leider nicht, ob es zwischen den Versionen Unterschiede im DLL-Handling gibt oder meine Bibliotheken sich anders verhalten, als vom Skript erwartet, auf jeden Fall schaffe ich es nicht, kurzfristig meine Skriptumgebung auf die neue Version umzustellen.

@Raijin: Nein, Ping blockiert bei mir nichts. Danke für den Hinweis auf die -w Option, damit wird ping für mich zum berechenbaren Partner hinsichtlich de Timings. Wenn ich jetzt noch wüsste, wie ich den ping-Output in eine Umgebungsvariable ausgebe, wäre der Rest ein Kinderspiel...

Viele Grüße, Halwe

@alle: Wo gibt es hier eigentlich den Danke-Button? Ich sehe zwar Bewertungspunkte in den Profilen aber keinen Button dafür.
 
Wie gesagt, ich kenne mich mit AHK nicht aus. In einer Batch-Datei könnte man eine Umgebungsvariable mit SETX fest setzen. SETX muss man aber unter Umständen aus dem Windows Resource Kit runterladen. Im Gegensatz zu SETX setzt SET eine Variable nur lokal, also nur in dem aktuellen CMD-Fenster. Schließt man das Fenster und macht ein neues auf, ist die Variable wieder zurückgesetzt.

Das wiederum kann dir trotz SETX aber auch einen Strich durch die Rechnung machen. Von AHK habe ich wie gesagt keinen Plan, aber wenn das Skript in einem CMD-Fenster läuft, das offen bleibt, wird die Änderung von SETX nicht ankommen, da ein CMD-Fenster die Umgebungsvariablen beim Start einmalig kopiert und dann mit der lokalen Kopie arbeitet.

Daher ist die Variante mit einer server.up Datei wohl einfach zu handhaben.

*edit
Ich wusste gar nicht, dass es überhaupt ein Bewertungssystem gibt. Mit Sternchen und Orden können wir aber nix anfangen. Harte Euros sind natürlich gerne gesehen (<-- Spaß!!). Ein Danke reicht vollkommen, wenn man helfen konnte ist man ja zufrieden.

*edit2
Hab gerade mal etwas geschaut, PingPlotter hat eine Skript-Engine. Man kann also eigene Plugins, etc. basteln. Evtl. kann man das damit sogar einfacher automatisieren. Ist eber ein 100%iger Schuß ins Blaue, ich hab das nicht ausprobiert!

*edit3
Noch besser: PowerShell
Monitoring-Script: Klick
Umgebungsvariablen: Klick
 
Zuletzt bearbeitet:
Hallo Raijin!
Danke für deine ausführliche Analyse des Problems.
Es scheint mir, als ob das mhepit den Umgebungsvariablen doch nicht ganz so leicht wird.

Werde dann wohl über einen ping-Aufruf mit Dateiauswertung gehen, bin inzwischen bei
Code:
ping -n 1 -w 200 <IP-Adresse> |find "Zeitangaben" >pinged.txt
und die anschließende Prüfung der Datei pinged.txt auf Größe > 0.
Nicht sehr elegant aber schnell und einfach und das sollte reichen.

Danke noch einmal allen Mitdenkern für die Tipps!

Viele Grüße, Halwe
 
Ich weiß nicht wie versiert du in Hochsprachen bist, aber mit Visual Studio (zB C#) kannst einen pingcheck auch mit wenigen Zeilen als .exe bauen - ohne den Output vom Ping-Befehl über den Umweg einer Datei zu parsen.

Das Problem beim Ping in der DOS-Box ist nämlich, dass ping lokalisiert ist. D.h., dass man nicht 100%ig sicher auf zB "received" triggern kann. Bei .NET gibt's nen Rückgabewert ok/nicht ok
 
Zurück
Oben