Seite 1 von 1

PB.Ex ICMP (Windows)

Verfasst: 11.05.2019 12:15
von RSBasic
Hallo,

mit dieser Bibliothek ist es möglich, eine beliebige Website bzw. einen Server anzupingen, um zu ermitteln, ob die Website erreichbar ist.

Funktionen:
  • SendICMPPing()
    • Syntax:

      Code: Alles auswählen

      Result = SendICMPPing(Address$, Timeout, TTL, DontFragment, @ErrorOutput$)
    • Beschreibung: Sendet an einen Server ein Ping-Paket (ICMP-Echo Message).
    • Parameter:
      1. Address$: Die Domain oder IP-Adresse des Servers.
      2. Timeout: Legt die Zeit in Millsekunden fest, wie lange maximal auf die Rückmeldung des Zielservers gewartet werden soll.
      3. TTL: Legt die Anzahl fest, wie oft das Paket an Routern und Gateways weitergeleitet werden darf, bis das Paket verworfen wird.
      4. DontFragment: Legt fest, ob das gesendete Paket fragmentiert werden kann.
      5. @ErrorOutput$: Falls ein Fehler auftrat, dann wird die Fehlermeldung in die Variable gespeichert. Diese Variable muss vor dem Übergeben mit 128 Zeichen reserviert werden. Maximale Länge der Rückgabe beträgt 128 Zeichen einschließlich des NULL-Zeichens. Wenn bei einem Fehler keine Fehlerbeschreibung zurückgegeben werden soll, dann kann stattdessen 0 übergeben werden.
    • Rückgabewert:
      • 1: Der Vorgang war erfolgreich.
    • Beispielcode:

      Code: Alles auswählen

      EnableExplicit
      
      Global PBEx_ICMP
      
      #PBEx_ICMP_Status_BadDestination = 11018
      #PBEx_ICMP_Status_BadHeader = 11042
      #PBEx_ICMP_Status_BadOption = 11007
      #PBEx_ICMP_Status_BadRoute = 11012
      #PBEx_ICMP_Status_DestinationHostUnreachable = 11003
      #PBEx_ICMP_Status_DestinationNetworkUnreachable = 11002
      #PBEx_ICMP_Status_DestinationPortUnreachable = 11005
      #PBEx_ICMP_Status_DestinationProhibited = 11004
      #PBEx_ICMP_Status_DestinationProtocolUnreachable = 11004
      #PBEx_ICMP_Status_DestinationScopeMismatch = 11045
      #PBEx_ICMP_Status_DestinationUnreachable = 11040
      #PBEx_ICMP_Status_HardwareError = 11008
      #PBEx_ICMP_Status_IcmpError = 11044
      #PBEx_ICMP_Status_NoResources = 11006
      #PBEx_ICMP_Status_PacketTooBig = 11009
      #PBEx_ICMP_Status_ParameterProblem = 11015
      #PBEx_ICMP_Status_SourceQuench = 11016
      #PBEx_ICMP_Status_Success = 0
      #PBEx_ICMP_Status_TimedOut = 11010
      #PBEx_ICMP_Status_TimeExceeded = 11041
      #PBEx_ICMP_Status_TtlExpired = 11013
      #PBEx_ICMP_Status_TtlReassemblyTimeExceeded = 11014
      #PBEx_ICMP_Status_Unknown = -1
      #PBEx_ICMP_Status_UnrecognizedNextHeader = 11043
      
      CompilerIf #PB_Compiler_Processor = #PB_Processor_x86
        PBEx_ICMP = OpenLibrary(#PB_Any, "PB.Ex_ICMP_x86.dll")
      CompilerElseIf #PB_Compiler_Processor = #PB_Processor_x64
        PBEx_ICMP = OpenLibrary(#PB_Any, "PB.Ex_ICMP_x64.dll")
      CompilerEndIf
      
      If PBEx_ICMP
        Prototype SendICMPPing(Address.p-Unicode, Timeout, TTL, DontFragment, ErrorOutput)
        Global SendICMPPing.SendICMPPing = GetFunction(PBEx_ICMP, "SendICMPPing")
        Prototype GetICMPStatus(ErrorOutput)
        Global GetICMPStatus.GetICMPStatus = GetFunction(PBEx_ICMP, "GetICMPStatus")
        Prototype GetICMPIPAddress(Output, ErrorOutput)
        Global GetICMPIPAddress.GetICMPIPAddress = GetFunction(PBEx_ICMP, "GetICMPIPAddress")
        Prototype GetICMPRoundTripTime(ErrorOutput)
        Global GetICMPRoundTripTime.GetICMPRoundTripTime = GetFunction(PBEx_ICMP, "GetICMPRoundTripTime")
        Prototype GetICMPTTL(ErrorOutput)
        Global GetICMPTTL.GetICMPTTL = GetFunction(PBEx_ICMP, "GetICMPTTL")
        
      EndIf
      
      Global Output$ = Space(1024)
      Global ErrorOutput$ = Space(128)
      
      Define ICMPStatus
      
      SendICMPPing("www.google.de", 1000, 128, 1, @ErrorOutput$)
      ICMPStatus = GetICMPStatus(@ErrorOutput$)
      If ICMPStatus = #PBEx_ICMP_Status_Success
        GetICMPIPAddress(@Output$, @ErrorOutput$)
        Debug "IP address: " + Output$
        Debug "Time needed: " + GetICMPRoundTripTime(@ErrorOutput$)
        Debug "TTL: " + GetICMPTTL(@ErrorOutput$)
      Else
        Debug "ICMP-Error: " + ICMPStatus
      EndIf
      
      CloseLibrary(PBEx_ICMP)
      
    GetICMPStatus()
    • Syntax:

      Code: Alles auswählen

      Result = GetICMPStatus(@ErrorOutput$)
    • Beschreibung: Ermittelt den Status. Diese Funktion ist nur nach dem Aufrufen der SendICMPPing()-Funktion gültig.
    • Parameter:
      1. @ErrorOutput$: Falls ein Fehler auftrat, dann wird die Fehlermeldung in die Variable gespeichert. Diese Variable muss vor dem Übergeben mit 128 Zeichen reserviert werden. Maximale Länge der Rückgabe beträgt 128 Zeichen einschließlich des NULL-Zeichens. Wenn bei einem Fehler keine Fehlerbeschreibung zurückgegeben werden soll, dann kann stattdessen 0 übergeben werden.
    • Rückgabewert: Mit Hilfe des Status-Wertes kann z.B. ermittelt werden, ob der Server erreichbar war oder ob ein Timeout auftrat. Folgende Konstanten können abgefragt werden:
      • #PBEx_ICMP_Status_BadDestination
      • #PBEx_ICMP_Status_BadHeader
      • #PBEx_ICMP_Status_BadOption
      • #PBEx_ICMP_Status_BadRoute
      • #PBEx_ICMP_Status_DestinationHostUnreachable
      • #PBEx_ICMP_Status_DestinationNetworkUnreachable
      • #PBEx_ICMP_Status_DestinationPortUnreachable
      • #PBEx_ICMP_Status_DestinationProhibited
      • #PBEx_ICMP_Status_DestinationProtocolUnreachable
      • #PBEx_ICMP_Status_DestinationScopeMismatch
      • #PBEx_ICMP_Status_DestinationUnreachable
      • #PBEx_ICMP_Status_HardwareError
      • #PBEx_ICMP_Status_IcmpError
      • #PBEx_ICMP_Status_NoResources
      • #PBEx_ICMP_Status_PacketTooBig
      • #PBEx_ICMP_Status_ParameterProblem
      • #PBEx_ICMP_Status_SourceQuench
      • #PBEx_ICMP_Status_Success
      • #PBEx_ICMP_Status_TimedOut
      • #PBEx_ICMP_Status_TimeExceeded
      • #PBEx_ICMP_Status_TtlExpired
      • #PBEx_ICMP_Status_TtlReassemblyTimeExceeded
      • #PBEx_ICMP_Status_Unknown
      • #PBEx_ICMP_Status_UnrecognizedNextHeader
      Weitere Informationen zu den einzelnen Status-Werten finden Sie hier: https://docs.microsoft.com/en-us/dotnet ... n.ipstatus
    GetICMPIPAddress()
    • Syntax:

      Code: Alles auswählen

      Result = GetICMPIPAddress(@Output$, @ErrorOutput$)
    • Beschreibung: Ermittelt die aufgelöste IP-Adresse des angepingten Servers. Diese Funktion ist nur nach dem Aufrufen der SendICMPPing()-Funktion gültig.
    • Parameter:
      1. @Output$: Die aufgelöste IP-Adresse wird in diese Variable gespeichert.
      2. @ErrorOutput$: Falls ein Fehler auftrat, dann wird die Fehlermeldung in die Variable gespeichert. Diese Variable muss vor dem Übergeben mit 128 Zeichen reserviert werden. Maximale Länge der Rückgabe beträgt 128 Zeichen einschließlich des NULL-Zeichens. Wenn bei einem Fehler keine Fehlerbeschreibung zurückgegeben werden soll, dann kann stattdessen 0 übergeben werden.
    • Rückgabewert:
      • 1: Der Vorgang war erfolgreich.
    GetICMPRoundTripTime()
    • Syntax:

      Code: Alles auswählen

      Result = GetICMPRoundTripTime(@ErrorOutput$)
    • Beschreibung: Ermittelt die benötigte Zeit in Millisekunden, wie lange es gedauert hat, das Ping-Paket zum Server zu senden und zurückzuschicken. Diese Funktion ist nur nach dem Aufrufen der SendICMPPing()-Funktion gültig.
    • Parameter:
      1. @ErrorOutput$: Falls ein Fehler auftrat, dann wird die Fehlermeldung in die Variable gespeichert. Diese Variable muss vor dem Übergeben mit 128 Zeichen reserviert werden. Maximale Länge der Rückgabe beträgt 128 Zeichen einschließlich des NULL-Zeichens. Wenn bei einem Fehler keine Fehlerbeschreibung zurückgegeben werden soll, dann kann stattdessen 0 übergeben werden.
    • Rückgabewert: Zeit in Millsekunden
    GetICMPTTL()
    • Syntax:

      Code: Alles auswählen

      Result = GetICMPTTL(@ErrorOutput$)
    • Beschreibung: Ermittelt den TTL-Wert (Time to Live), wie oft das Ping-Paket an Routern und Gateways weitergeleitet wurde, bis das Paket ankam. Diese Funktion ist nur nach dem Aufrufen der SendICMPPing()-Funktion gültig.
    • Parameter:
      1. @ErrorOutput$: Falls ein Fehler auftrat, dann wird die Fehlermeldung in die Variable gespeichert. Diese Variable muss vor dem Übergeben mit 128 Zeichen reserviert werden. Maximale Länge der Rückgabe beträgt 128 Zeichen einschließlich des NULL-Zeichens. Wenn bei einem Fehler keine Fehlerbeschreibung zurückgegeben werden soll, dann kann stattdessen 0 übergeben werden.
    • Rückgabewert: Anzahl der Weiterleitungen.
Systemvoraussetzungen:
  • Windows Vista oder höher
  • .NET Framework 4.5 oder höher
  • Unicode-Aktivierung (standardmäßig ab PB 5.50)
Lizenz: Diese DLL-Datei ist kostenlos und darf sowohl privat als auch kommerziell verwendet werden.
Folgende Copyright-Texte müssen mitgeliefert werden:
Copyright © 2019 RSBasic.de
Download: https://www.rsbasic.de/downloads/downlo ... x_ICMP.zip
Bild

Ich würde mich über Feedbacks, Verbesserungsvorschläge, Fehlermeldungen oder Wünsche sehr freuen. Wer mich unterstützen möchte, kann mir auch was kleines spenden. Danke :)

Re: PB.Ex ICMP (Windows)

Verfasst: 11.05.2019 21:07
von Imhotheb
:praise: :praise: :praise: :praise: :praise:

Vielen Dank dafür ... endlich kann ich den Workaround mit RunProgram("ping") rausschmeißen.

Re: PB.Ex ICMP (Windows)

Verfasst: 11.05.2019 23:17
von Sicro
RSBasic hat geschrieben:Rückgabewert:

1: Der Vorgang war erfolgreich.
Und im Fehlerfall ungleich eins oder null?
Das ist entscheidend, ob man

Code: Alles auswählen

If Result

Code: Alles auswählen

If Not Result
schreiben kann oder zwingend

Code: Alles auswählen

If Result = 1

Code: Alles auswählen

If Result <> 1
schreiben muss.

Schau dir mal .NET Core an oder behalte es im Auge. Vielleicht kannst du deine DLLs später mal plattformunabhängig anbieten.

Re: PB.Ex ICMP (Windows)

Verfasst: 12.05.2019 07:58
von RSBasic
Guten Morgen

Im Fehlerfall bei einem Exception ist der Rückgabewert gleich 0.
Sicro hat geschrieben:Schau dir mal .NET Core an oder behalte es im Auge. Vielleicht kannst du deine DLLs später mal plattformunabhängig anbieten.
Danke für den Tipp. :)