Code verkürzen bei mehreren Ping´s

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von zauber777.

    Code verkürzen bei mehreren Ping´s

    Hallo,

    ich hatte es jetzt schon häufiger, dass ich bei euch Codes gefunden habe, welche kürzer sind und das gleiche tun, wie eine lange Version eines Codes.
    Nun ist die Frage, ob man dies auch für den folgenden Ping-Code machen kann!?

    Es sind ca 20 IP´s gegeben, welche nacheinander gepingt werden sollen. Sobald eine erreichbar ist, dann soll diese IP verwendet werden (aktuell in meinem Code einfach erst einmal in ein Label übertragen werden).
    Die restlichen IP´s müssen nicht mehr gepingt werden, da schon eine gefunden wurde, welche erreichbar ist.

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim A1 As String
    3. A1 = "192.168.1.1"
    4. Dim A2 As String
    5. A2 = "192.168.1.3"
    6. Dim A3 As String
    7. A3 = "192.168.1.11"
    8. '.
    9. '.weitere ca. 20 IP´s
    10. '.
    11. If My.Computer.Network.Ping(A1) Then
    12. Label1.Text = "Die IP : " & A1 & "ist erreichbar"
    13. ElseIf My.Computer.Network.Ping(A2) Then
    14. Label1.Text = "Die IP : " & A2 & "ist erreichbar"
    15. ElseIf My.Computer.Network.Ping(A3) Then
    16. Label1.Text = "Die IP : " & A3 & "ist erreichbar"
    17. '.
    18. '.weitere ca. 20 IP´s
    19. '.
    20. Else
    21. Label1.Text = "nichts erreichbar"
    22. End If
    23. End Sub
    tu die As in eine List(Of String).
    Dann gehe diese Liste in einer Schleife durch.
    Oder verwende einfach Linq - dann wirds ein Einzeiler.

    VB.NET-Quellcode

    1. dim addresses={"192.168.1.1", "192.168.1.3", "192.168.1.11"}.ToList()
    2. dim erreichbar = addresses.FirstOrDefault(function(a)My.Computer.Network.Ping(a))
    3. Label1.Text = "Die IP : " & erreichbar & "ist erreichbar"

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. For Each ip in {"192.168.1.1","192.168.1.2","192.168.1.3"}
    3. If My.Computer.Network.Ping(ip) Then
    4. Label1.Text = $"Die IP {ip} ist erreichbar"
    5. Exit Sub
    6. End If
    7. Next
    8. Label1.Text = "nichts erreichbar"
    9. End Sub

    Ausserdem würde ich mit System.Net.NetworkInformation.Ping.Send arbeiten.
    Und wenn es viele sind, macht eine asynchrone Parallelabfrage Sinn, um nicht 30 x 5 Sekunden warten zu müssen, wenn kein Server verfügbar ist.

    Edit: Die Linq-Variante aus obigem Post ist auch ein schöner Ansatz.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „petaod“ ()

    Die Post#2-Variante an sich könnte man noch etwas kürzen.

    VB.NET-Quellcode

    1. Dim erreichbar = {"192.168.1.1", "192.168.1.3", "192.168.1.11"}.FirstOrDefault(Function(x) My.Computer.Network.Ping(x))
    2. Label1.Text = $"Die IP {erreichbar} ist erreichbar."

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @All Wenn wir nun noch den VB6-Code rausschmeißen und die .NET-Variante verwenden, wirds richtig gut:
    docs.microsoft.com/de-de/dotne…ion.ping?view=netcore-3.1
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Vollzitat entfernt ~EaranMaleasi

    Ich habe mich für die Methode von @petaod entschieden und diese in einen Thread gepackt.
    Nun jedoch noch eine Frage :
    Manchmal ist es so, dass schon die erste IP erreichbar ist und diese wird dann genutzt, manchmal ist aber auch erst die vorletzte oder so erreichbar und wird dann zum nutzen übergeben, jedoch dauert dann natürlich die Abfrage länger, deswegen wäre es schön, wenn ich die IP anzeigen lassen kann, welche der Code gerade anpingt / prüft ob erreichbar.
    Ist es möglich über ein Label anzeigen zu lassen, welche IP gerade gepingt wird, also an welche Stelle der Code gerade ist?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „EaranMaleasi“ ()

    zauber777 schrieb:

    Ist es möglich über ein Label anzeigen zu lassen, welche IP gerade gepingt wird
    Klar.
    Schreib einfach zwischen Zeile 2 und 3 (in Post #3)

    VB.NET-Quellcode

    1. Label1.Text = $"Die IP {ip} wird gepingt"


    Aber um die Warterei zu verkürzen, schrieb ich ja schon

    petaod schrieb:

    Und wenn es viele sind, macht eine asynchrone Parallelabfrage Sinn, um nicht 30 x 5 Sekunden warten zu müssen, wenn kein Server verfügbar ist.
    Nur bin ich mir nicht sicher, ob dich das nicht überfordert.
    Die nötigen Tipps kannst du dir hier holen (ist ja eh dein Thread).
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „petaod“ ()