Form friert bei Netzwerktest ein falls Netz nicht vorhanden ist

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von Schalterschorsch.

    Form friert bei Netzwerktest ein falls Netz nicht vorhanden ist

    Hallo Vb-Paradise-Gemeinde,

    Ich will einen Netzwerktest einbauen, der anhand einer Lampe sagt, ob man verbunden ist oder nicht.

    Hier ist meine Idee: - ein timer läuft und triggert eine Netzwerk-Test-Sub alle 20 Sekdunden
    Test: - ist ein IntraNet-share da ? - wenn nein : - ist google.de ansprechbar ?

    Wenn nur google da ist, schalte auf orange, wenn das share da ist schalte auf grün, ansonsten auf rot

    Das Problem: - ohne Netzwerkverbindung friert die Form während des Tests ein (not responding)
    Intern kann man nur den Proxy anpingen und der bietet auf einem Port ein PAC-File zum Download feil - den Download so einzubasteln habe ich bisher nicht richtig umsetzen können.

    Die Frage ist nun: - bekomme ich das Grundproblem mit dem einfrieren irgendwie gelöst ?

    Ich habe probiert: - if directory exist, network ping,

    Mein code:


    VB.NET-Quellcode

    1. Public Sub NetworkAvailiblity()
    2. If Directory.Exists("\\internesShare") = True Then
    3. 'If My.Computer.Network.Ping("proxy") Then
    4. 'MsgBox("success")
    5. BTN_NW.BackColor = Color.Green
    6. ElseIf My.Computer.Network.Ping("google.de") Then
    7. BTN_NW.BackColor = Color.Orange
    8. 'NWtimer.Interval = 20000
    9. 'MsgBox("no reply")
    10. Else
    11. BTN_NW.BackColor = Color.Red
    12. NWtimer.Interval = 20000
    13. End If
    14. End Sub
    Mit folgendem Beispiel kannst du prüfen ob dein PC eine verbindung zum Internet hat, dann brauchst du google nicht "pingen"

    VB.NET-Quellcode

    1. Public Class Form1
    2. Declare Function InternetGetConnectedState Lib "wininet.dll" (ByRef lpdwFlags As Int32, ByVal dwReserved As Int32) As Boolean
    3. Private Function InternetConnectedState() As Boolean
    4. If InternetGetConnectedState(0, 0) Then
    5. InternetConnectedState = True
    6. Else
    7. InternetConnectedState = False
    8. End If
    9. End Function
    10. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    11. MessageBox.Show(CStr(InternetConnectedState()))
    12. End Sub
    13. End Class


    mfG

    Derfuhr
    Die obige Lösung ist keine, da sie das eigentliche Problem nicht behandelt, nämlich das Einfrieren der Form.
    Du führst da eine synchrone Methode im Hauptthread aus, was diesen für die Ausführungsdauer der Methode "einfrieren" lässt. Führ den Kram in nem eigenen Thread aus, um das Problem vernünftig zu beheben.

    Wenn dir Threads zu kompliziert sind, kannst du dein Programm auch auf .NET 4.5 upgraden und die Async/Await-Funktionen nutzen, die für sowas gemacht wurden.
    guggetmol, in den "AnwendungsEreignissen" scheints auch etwas zu geben, was Polling erübrigen täte:

    VB.NET-Quellcode

    1. Namespace My
    2. ' Für MyApplication sind folgende Ereignisse verfügbar:
    3. '
    4. ' Startup: Wird beim Starten der Anwendung noch vor dem Erstellen des Startformulars ausgelöst.
    5. ' Shutdown: Wird nach dem Schließen aller Anwendungsformulare ausgelöst. Dieses Ereignis wird nicht ausgelöst, wenn die Anwendung nicht normal beendet wird.
    6. ' UnhandledException: Wird ausgelöst, wenn in der Anwendung eine unbehandelte Ausnahme auftritt.
    7. ' StartupNextInstance: Wird beim Starten einer Einzelinstanzanwendung ausgelöst, wenn diese bereits aktiv ist.
    8. ' NetworkAvailabilityChanged: Wird beim Herstellen oder Trennen der Netzwerkverbindung ausgelöst.
    9. Partial Friend Class MyApplication
    10. End Class
    11. End Namespace
    Das er sich ändern kann ist keine Frage, dies ließe sich ja mit nem Timer lösen.
    Aber was muss man tun um es auswerten zu können?
    Ich hatte für mein backuptool einfach den Status meines Servers abgefragt, sprich die Verfügbarkeit des netzlaufwerkes.

    Aber den allgemeine Zustand der Verbindung würde mich hält auch interessieren.
    1.) nicht über den Domainname prüfen, lieber über ne IP
    2.) System.Net.NetworkInformation.Ping benutzen nicht my irgendwas
    3.) TimeOut setzen

    VB.NET-Quellcode

    1. Public Function CheckInet(Optional ByVal Address As String = "8.8.8.8", Optional ByVal TimeOut As Integer = 5000) As Boolean
    2. Using p As New System.Net.NetworkInformation.Ping()
    3. If p.Send(Address, TimeOut).Status <> Net.NetworkInformation.IPStatus.Success Then Return False Else Return True
    4. End Using
    5. End Function


    Wenn trotz allem noch zu einem ungewünschten ergebnis kommt, muss man halt asynchron arbeiten.

    Edit:

    VB.NET-Quellcode

    1. Public Sub CheckInetAsync(Optional ByVal Address As String = "8.8.8.8", Optional ByVal TimeOut As Integer = 15000)
    2. Using p As New System.Net.NetworkInformation.Ping()
    3. If p.Send(Address, TimeOut).Status <> Net.NetworkInformation.IPStatus.Success Then OnCheck(False) Else OnCheck(True)
    4. End Using
    5. End Sub
    6. Delegate Sub CallBack()
    7. Public Sub OnCheck(ByVal state As Boolean)
    8. Me.Invoke(New CallBack(Sub() NachUeberpruefung(state)))
    9. End Sub
    10. 'Ab hier läuft dein Code weiter
    11. Public Sub NachUeberpruefung(ByVal state As Boolean)
    12. If state Then
    13. MsgBox("Internetverbindung steht!")
    14. Else
    15. MsgBox("Keine Internetverbindung!")
    16. End If
    17. End Sub
    18. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    19. Dim t As New Threading.Thread(AddressOf CheckInetAsync)
    20. t.Start()
    21. End Sub
    SWYgeW91IGNhbiByZWFkIHRoaXMsIHlvdSdyZSBhIGdlZWsgOkQ=

    Weil einfach, einfach zu einfach ist! :D

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „BiedermannS“ ()

    p.Send(Address, TimeOut).Status hat als Return-Wert Net.NetworkInformation.IPStatus welcher angibt ob der Ping erfolgreich war bzw. warum er nicht erfolgreich war (Den Status des PingReply).

    VB.NET-Quellcode

    1. if p.Send(Address, TimeOut).Status <> Net.NetworkInformation.IPStatus.Success then

    überprüft ob der Ping fehlschlägt.
    SWYgeW91IGNhbiByZWFkIHRoaXMsIHlvdSdyZSBhIGdlZWsgOkQ=

    Weil einfach, einfach zu einfach ist! :D
    Vielen Dank für eure hilfreichen Antworten, ihr helft mir echt weiter :D
    Ich werde es wahrscheinlich in einen extra Thread reinpacken - eine andere Idee, die mir kam, wäre das parsen vom ipconfig-output.
    Da ich genau schauen muss, ob man im corporate-Netz ist oder nicht, kann ich diese wininet.dll-Idee z.B. nicht nutzen.
    In der Firma, in der ich arbeite, haben wir nun teils NAC scharf geschaltet. Maschinen haben dann zwar Netz- sitzen aber vielleicht im Gäste-Vlan fest.
    Dort bekommt man auch eine IP und kann nach Authentisierung online - interne Shares sind aber von dem Netz unerreichbar ...


    MfG

    Schorsch

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