Ermitteln ob ein Server Online ist

16/02/2017 - 13:11 von Klaus Ketelaer | Report spam
Hallo zusammen,

ich muss bei allen Servern in meinem Netz prüfen, ob
sie laufen, um anschließend die Freigaben auszulesen.

Im Grunde ist das kein Problem, wenn da nicht die
endlosen Timeout-Zeiten wàren. Bei den Servern, die
offline sind, muss ich 2-3 Sekunden (und lànger) warten,
bis ich eine Antwort bekomme.

Ich habe bisher unzàhlige Sachen ausprobiert, aber
es dauert alles viel zu lange.

Hat von Euch jemand eine Idee, wie ich prüfen kann,
ob ein Server online ist, und eine Antwort im
Millisekunden-Bereich bekomme?

(Im PHP und Perl habe ich das gelöst, indem ich ein
Socket öffne und einen 50ms Timeout setze. Wie ich das
mit VB umsetzen könnte, weiss ich auch nicht, weil
ich nicht so recht weiss, wohin ich ein Socket
öffnen könnte...)

Gruß Klaus
 

Lesen sie die antworten

#1 Wolfgang Wolf
16/02/2017 - 15:05 | Warnen spam
Am 16.02.2017 um 13:11 schrieb Klaus Ketelaer:
Hallo zusammen,


(Im PHP und Perl habe ich das gelöst, indem ich ein
Socket öffne und einen 50ms Timeout setze. Wie ich das
mit VB umsetzen könnte, weiss ich auch nicht, weil
ich nicht so recht weiss, wohin ich ein Socket
öffnen könnte...)




Lass mich raten: Ein Socket ist eine Kombi aus IP und Port. Wo geht denn
dein Perl-Socket hin? Kannst doch mit VB das gleiche Socket verwenden.
Es gibt genug VB-TCP/UDP Klassen, die so was mittels API können, sofern
die jeweiligen Firewalls das nicht blocken. Aber wenn es mit Perl geht,
sollte es es mit VB auch gehen.

Schön am Ping ist halt, dass du keinen Port brauchst. Übrigens, am Ping
kannst du auch das Zeitlimit einstellen, siehe Parameter -w in der
Shell. Wenn deine lokalen Server schnell antworten, kannst damit die
Wartezeit verkürzen. Außerdem könntest du die Server parallel abfragen
mittels ActiveX-Exe oder einer Multithread-DLL, wie der vbRichClient.

Kannst ja mal das als Einstieg versuchen:

Private Sub Form_Click()

Set objWMIService = GetObject("winmgmts:\\.oot\cimv2")
Set colItems = objWMIService.ExecQuery _
("Select * from Win32_PingStatus " & _
"Where TimeOut = 60 AND Address = '192.168.22.254'")
For Each objItem In colItems
If objItem.StatusCode = 0 Then Debug.Print "Ok"
Next
End Sub

Schönen Gruß
W. Wolf

Ähnliche fragen