Internetverbindung prüfen

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

Es gibt 28 Antworten in diesem Thema. Der letzte Beitrag () ist von Xylon.

    Internetverbindung prüfen

    Hallo alle zusammen,

    bevor jetzt einige schon beim lesen des Titels genervt sind: Ich weiß, dass dieses Thema schon zum Xten male behandelt wurde. Ich hab' mich durch das Forum und Google gewühlt, und bin auf einige Threads und msdn Artikel gestoßen. Ich habe so ziemlich alles ausprobiert, stoße dabei aber auf ein Problem. Sobald das Programm startet prüft es alle paar Sekunden die Verbindung via Timer. Ich bin mir zu 100% sicher, dass dort nicht der Fehler liegt. Wie dem auch sei, als Test ließ ich mir dann mit folgendem Code eine MessageBox anzeigen:

    Visual Basic-Quellcode

    1. Public Sub CheckConnection()
    2. Try
    3. My.Computer.Network.Ping("www.google.de")
    4. con = True
    5. Label11.Text = "Online"
    6. Label11.ForeColor = Color.Green
    7. PictureBox1.Image = My.Resources.globe_connected
    8. Label1.ForeColor = Color.Green
    9. MsgBox("Connected")
    10. Catch ex As Exception
    11. con = False
    12. Label11.Text = "Offline"
    13. Label11.ForeColor = Color.Red
    14. PictureBox1.Image = My.Resources.globe_disconnected
    15. Label1.ForeColor = Color.Red
    16. MsgBox("Disconnected")
    17. Exit Sub
    18. End Try
    19. End Sub


    Bin ich mit dem Internet verbunden, wird mir sofort die Internetverbindung bestätigt, trenne ich jedoch die Verbindung, wird mir nicht nur keine Nachricht angezeigt, das Programm hängt sich auch noch auf. Das gleiche passiert, wenn der Code per ButtonClick event ausgeführt wird. Auch wenn ich schon mit getrennter Verbindung das Programm starte, hängt es. Ich kann nicht mal den Sub bei der exception beenden. Mit oder ohne Sub bzw. Funktion und return-Anweisung, es passiert immer dasselbe. Vermutlich liegt es an mir, aber ich finde weder die Wurzel des Problems, noch eine Lösung. Auch im Internet habe ich keine hilfreichen Themen gefunden und wende mich nun an euch :/ Tut mir leid, wenn ich mit sowas hier ankomme, aber anders wusste ich mir leider nicht zu helfen...

    Viele Grüße,
    Justin
    My.Computer.Network.Ping("www.google.de")
    überprüft ja nur ob ein ping besteht. mach mal den timeout auf 1000 oder so keine ahnung. weiss grade nich genau wie das geht aber du suchst ja nach einem ping von google.de. ich weiss nich wielange man nach dem ping suchen kann bis er einsieht das es keinen gibt :D
    Naja, mit My-Namespace, das ist halt so ne Sache und anpingen, was machste da, wenn die Seite für den User nicht erreichbar ist, warum auch immer?
    Schnapp Dir einfach die entsprechende WinAPI (Klick) via DllImport und frag das damit ab.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    @ManuelSoftware
    dies überprüft nur ob du mit dem netzwerk verbunden bist nicht aber ob du mit dem internet verbunden bist!

    machs mal so weiss aber grade nich ob das geht
    If My.Computer.Network.Ping("www.google.de") <= 1000 Then
    das müsste eigentlich überprüfen ob du ein ping unter 1000 (also 1 sekunde) zu google.de hast und wenn ja hast du internet und wenn nein dan eben nich...
    Also einerseits hat MVN050 recht, denn die My-Anweisung kannte ich schon, und es gibt immer True an, wenn der Computer in einem Netzwerk ist. Ob er verbunden ist oder nicht wird nicht überprüft. Daher habe ich mal mit hilfreich abgestimmt, denn genau das wollte ich auch schreiben :D Leider funktioniert deine Möglichkeit ebenfalls nicht. Logischerweise kann das schon nicht funzen, da diese Anweisung entweder True oder False zurückgibt. Das was du meinst wäre ja der Ping-timeout, der als Argument angegeben werden kann, aber das hatten wir ja schon. :/ Also nach wie vor: Das Programm hängt.

    @Trade: Ich hab das mit der WININET API versucht, dass geht nicht. Wie gesagt, ich habe mich schon umgeschaut und alles ausprobiert. Mit der Win Api wird mir gar nichts angezeigt.

    Xylon schrieb:

    Ich hab das mit der WININET API versucht, dass geht nicht. Wie gesagt, ich habe mich schon umgeschaut und alles ausprobiert. Mit der Win Api wird mir gar nichts angezeigt.

    Aha. Und jetzt? Zeig' doch mal Code, sonst wird das nix.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    @Trade:

    Visual Basic-Quellcode

    1. Private Declare Function InternetGetConnectedState Lib "wininet.dll" (ByRef _
    2. dwFlags As Integer, ByVal dwReserved As Integer) As Integer
    3. Dim flags As Integer = 0
    4. Dim inet As Integer = InternetGetConnectedState(flags, 0)


    Den habe ich verwendet. 1 stünde für eine Verbindung, 0 für keine Verbindung. Die If-Abfrage ergab kein Resultat, weder 0 noch 1 wurde erkannt, bei else allerdings schon etwas. Ich denke aber doch das es auch mit dem Pingen gehen muss, schließlich erhalte ich bei einer Verbindung ein Ergebnis.

    Hier der Link zu dem Post, aus dem ich die Anleitung habe: vbarchiv.net/forum/id22_i4021t…etverbindung-pruefen.html

    Xylon schrieb:

    Die If-Abfrage ergab kein Resultat, weder 0 noch 1 wurde erkannt, bei else allerdings schon etwas.

    Na, dann zeig das doch her und rede nicht ins Leere.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    @Trade: Ich dachte eigentlich nicht, dass das nötig ist, weil man da schlecht was falsch machen kann. Also wie schon gesagt, oben die Funktion, hier die Abfrage:

    Visual Basic-Quellcode

    1. If inet = 0 Then
    2. MsgBox("Not connected")
    3. ElseIf inet = 1 Then
    4. MsgBox("Connected")
    5. Else
    6. MsgBox("Something else")
    7. End If


    Ich hab' das mal eben schnell nochmal geschrieben. Inet ist das State, welches eigentlich angeben soll, ob der PC mit dem internet verbunden ist oder nicht. Bei dieser Abfrage erhalte ich dann immer die MsgBox "Connected", auch wenn ich nicht verbunden bin. Letzes mal hatte ich ich genau dasselbe, nur wurde mir da die ganze Zeit die MsgBox aus dem else gezeigt, vermutlich hab' ich mich da vertippt. Ist ja auch egal. Hab bei Google auch nochmal nach dieser Api geschaut und dort steht das genau wie bei vb@rchiv. Was also könnte ich falsch gemacht haben?
    Du solltest lernen mit Breakpoints zu arbeiten, um Dir Informationen besser zu holen.

    Ich habe das bei mir so implementiert in C#:

    C#-Quellcode

    1. [DllImport("wininet.dll")]
    2. private extern static bool InternetGetConnectedState(out int connDescription, int ReservedValue);
    3. /// <summary>
    4. /// Checks if an internet connection is available.
    5. /// </summary>
    6. public static bool IsConnectionAvailable()
    7. {
    8. int Desc;
    9. return InternetGetConnectedState(out Desc, 0);
    10. }

    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Ich arbeite aber ungern mit C#, vor allen Dingen weil ich das ganze Projekt vor ungefähr nem Jahr angefangen hab und da mit VB gearbeitet hab. Das alles umzucoden ist mir zu viel Arbeit, und die ganzen Übersetzer im Internet sind ungenau. Aber trotzdem schon mal danke für den Versuch. Jedoch passiert das gleich wie mit meinem Code. Ich habe deinen in VB umgecoded:

    Visual Basic-Quellcode

    1. Private Declare Function InternetGetConnectedState Lib "wininet.dll" (ByRef _
    2. connDescription As Integer, ByVal ReservedValue As Integer) As Boolean
    3. Public Shared Function IsConnectionAvailable() As Boolean
    4. Dim Desc As Integer
    5. Return InternetGetConnectedState(Desc, 0)
    6. End Function


    aufruf:

    Visual Basic-Quellcode

    1. If IsConnectionAvailable() = True Then
    2. MsgBox("Connected")
    3. ElseIf IsConnectionAvailable() = False Then
    4. MsgBox("Disconnected")
    5. End If


    Sollte so richtig sein, oder? Ich habs nicht so mit C#, wie gesagt. Es kommt immer die Message "Connected".
    Du musst ja eh nur das umschreiben.
    Hast Du das Internet denn deaktiviert?
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Ich hab das Programm gestartet, dort kam Connected. Dann habe ich die Verbindung getrennt, es kam immer noch nur Connected. Beim Wiederverbinden dasselbe :/ Nochmal: Ich möchte die Verbindung prüfen, nicht die Netzwerke, die verfügbar sind. Das ginge ja mit dem My-Namespace. Kann es sein das die Api genau dies tut?
    Der My-Namespace ist mMn so oder so ungeeignet.
    Die API-Methode prüft, ob eine Internetverbindung verfügbar ist, eben nicht Netzwerke.

    Siehe Screenshots, im ersten Bild ist Internet verfügbar und der Test ist erfolgreich, im zweiten ist kein Internet da und der Test schlägt fehl.
    Hinter der Methode IsConnectionAvailable steckt btw der Code von oben.

    Also, das funzt eigentlich perfekt.



    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Es ist mir klar das das der Code von oben ist, ich kann Lesen. Nur wieso funzt der dann nicht bei mir? Es kann doch eigentlich nicht daran liegen, dass ich VB nutze, oder? Wäre mir jetzt neu. Und richtig umgecoded müsste es auch sein.
    Kann ich mir nicht vorstellen, aber naja, ist alles bestimmt möglich.
    Um das herauszufinden kannst Du Dir ja eine kleine C#-DLL machen und die einbinden, dann kann man sehen, ob es daran liegt.

    Ansonsten müsstest Du mal Haltepunkte setzen und im Einzelschritt durchloopen und nachsehen, was passiert.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!: