Mittwoch, 19. März 2008

Netzwerk Ping in VFP / Network ping with VFP

Wie eine Netzwerkadresse auf ihre Verfügbarkeit geprüft wird dürfte wohl den meisten Entwicklern bekannt sein...

    ping domaenenname.de

Hierbei erfolgt die Namensauflösung in eine IP-Adresse bei korrekt konfiguriertem DNS automatisch. Alternativ können wir natürlich auch direkt die IP-Adresse eingeben.

    ping 192.168.1.70

Im DOS-Befehlsfenster oder auch in Batchdateien kann es heute noch durchaus sinnvoll sein, diesen Befehl einzusetzen. Aber selbst dort stossen wir sofort an die Grenzen dieses transienten DOS-Befehls, er liefert nämlich nur eine visuelle Rückmeldung.

Aus diesem Grund kann ping.exe nicht für eine Ergebnisabfrage und eine davon abhängige weitere Programmausführung eingesetzt werden. In Batchdateien kommt bei mir deshalb schon lange das kleine Tool alive.exe zum Einsatz. Es liefert einen Fehlercode (im DOS-Jargon Errorlevel), der über das Ergebnis Auskunft gibt und so die weitere Verarbeitung steuern kann.

@echo off
cls

set TGT_HOST=myHost
set PRT_SCREEN="Y"
set PRT_FILE="C:\TEMP"

alive /repeat=30 %TGT_HOST% >>%PRT_FILE%
if %errorlevel% == 255 if %PRT_SCREEN% == "Y" echo Unbekannter Fehler
if %errorlevel% == 8   if %PRT_SCREEN% == "Y" echo Zieladresse unbekannt
if %errorlevel% == 7   if %PRT_SCREEN% == "Y" echo Verbindungsweg zu lang
if %errorlevel% == 6   if %PRT_SCREEN% == "Y" echo Hardwarefehler
if %errorlevel% == 5   if %PRT_SCREEN% == "Y" echo Zielport nicht erreichbar
if %errorlevel% == 4   if %PRT_SCREEN% == "Y" echo Zielprotokoll nicht erreichbar
if %errorlevel% == 3   if %PRT_SCREEN% == "Y" echo Zielnetzwerk nicht erreichbar
if %errorlevel% == 2   if %PRT_SCREEN% == "Y" echo Zielrechner nicht erreichbar
if %errorlevel% == 1   if %PRT_SCREEN% == "Y" echo Paketlaufzeit abgelaufen
if %errorlevel% == 0   goto :OEFFNE_VERBINDUNG

goto :ENDE_DER_VERARBEITUNG

:OEFFNE_VERBINDUNG
REM Hier findet der Connect und die sonstige Verarbeitung statt

:ENDE_DER_VERARBEITUNG
cls

So weit so gut. Aber wer möchte in VFP schon freiwillig eine hässliche DOS-Box öffnen? Also suchen wir uns einen anderen Weg.

Hilfreich ist hierbei die IP-Hilfs-API (zu finden im WINDOWS\System32 Ordner (iphlpapi.dll).
Im folgenden Codebeispiel, das im übrigen auch als Methode in der Klassenbibliothek unserer Wahl implementiert werden kann, ist die maximale Anzahl an Hops auf 5 beschränkt.

FUNCTION isAlive
LPARAMETERS vIpNum, vSilent

    * Deklaration der API-Schnittstelle
    DECLARE INTEGER GetRTTAndHopCount IN Iphlpapi;
       INTEGER DestIpAddress, LONG @HopCount,;
       INTEGER MaxHops, LONG @RTT
    DECLARE INTEGER inet_addr IN ws2_32 STRING cp

    * Deklaration der benötigten Variablen
    LOCAL lnDst, lnHop, lnRTT, llReturn

    lnDst        = inet_addr(m.vIpnum)
    llReturn    = .F.
    STORE 0 TO lnHop, lnRTT

    * Zieladresse anpingen und wenn als Ergebnis eine
    * 0 geliefert wird, dann war der ping erfolglos
    IF GetRTTAndHopCount(lnDst, @lnHop, 5, @lnRTT) = 0

        TEXT TO lcMsg TEXTMERGE NOSHOW PRETEXT 3
            keine Antwort von IP-Adresse <<m.vIpnum>>
        ENDTEXT
    
    * Andernfalls konnte die Zieladresse kontaktiert werden
    ELSE

        TEXT TO lcMsg TEXTMERGE NOSHOW PRETEXT 3
            Antwort von IP-Adresse <<m.vIpnum>>
            (<<m.lnRTT>> MSek / <<m.lnHop>> Hops)
        ENDTEXT
        llReturn = .T.
      
    ENDIF

    * Wenn Meldung erlaubt, dann das Ergebnis anzeigen
    IF !vSilent
        MESSAGEBOX(lcMsg,0+64+0,[Programminformation])
    ENDIF

    * Rückmeldung .T. = erfolgreich, .F. = erfolglos
    RETURN llReturn

ENDFUNC

Keine Kommentare:

Kommentar veröffentlichen