Abfrage der öffentlichen IP-Adresse

    • VB.NET

      Abfrage der öffentlichen IP-Adresse

      Hey,

      da immer wieder die Frage auftaucht, wie man denn seine öffentliche IP-Adresse in Erfahrung bringen kann, hab ich mich entschlossen, ein kurzes Tutorial darüber zu verfassen.

      Heutzutage findet man in fast allen Haushalten folgende Netzwerkstruktur: Mehrere Endgeräte wie PCs, Fernseher, Spielekonsolen usw. nutzen als Gateway einen Router. Dieser Router ist die zentrale Vermittlungsstelle. Nur diesem Router wird eine öffentliche IP-Adresse zugeteilt. Alle innerhalb des LANs angeschlossenen Geräte erhalten eine, in der Regel vom Router zugeteilte, private IP-Adresse (192.168.0.X, 192.168.1.X usw.). Aus diesem Grunde ist eine Abfrage der öffentlichen IP nur über Umwege möglich, da der PC nichts von seiner öffentlichen IP weiß.

      Hier gibt es 2 Wege zur Lösung.

      1. Viele Router bieten ein frei zugängliches WebInterface, wo Informationen über die Internetverbindung (öff. IP, DownStream, UpStream, Status usw...) bereitgestellt werden. Eine direkte Abfrage dieses WebInterfaces wäre die elegantere Lösung. Nur leider gibt es eine Vielzahl verschiedener Router, welche alle ein anderes WebInterface bereitstellen. Eine allgemein gültige Lösung wäre hier unmöglich.

      2. Es gibt verschiedene Webseiten, die bei Aufruf die IP des Anfragestellers ausgeben. Diese Webseiten kann man sich zunutze machen. Problem hierbei ist: Ändert der Anbieter das Layout dieser Ausgabe, so muss der VB-QuellCode entsprechend angepasst werden. Ein weiterer Nachteil ist der oft undurchsichtige HTML-Code dieser Seiten. Darum muss ein Anbieter gefunden werden, der eine möglichst einfache Anzeige bereitstellt.

      Im folgenden wird die Möglichkeit 2 umgesetzt. Als Anbieter wird checkip.dyndns.com/ genutzt, da hier die Ausgabe sehr einfach gehalten ist. Im Anhang findet ihr die Projektdatei als .zip-Archiv.

      Im Projekt findet ihr die Klasse PublicIP

      VB.NET-Quellcode

      1. Imports System.Net
      2. Public Class PublicIP
      3. ''' <summary>
      4. ''' Die Sericeadresse, von der die IP abgefragt wird.
      5. ''' </summary>
      6. Public Property ServiceAddress As Uri = New Uri("http://checkip.dyndns.com/")
      7. Private WithEvents _wClient As WebClient
      8. ''' <summary>
      9. ''' Wird ausgelöst, wenn die Abfrage der IP erfolgreich war.
      10. ''' </summary>
      11. Public Event IPUpdateCompleted As EventHandler(Of IPUpdateEventArgs)
      12. ''' <summary>
      13. ''' Wird ausgelöst, wenn bei der Abfrage der IP ein Fehler auftritt.
      14. ''' </summary>
      15. Public Event IPUpdateError As EventHandler
      16. ''' <summary>
      17. ''' Erzeugt eine neue Instanz der Klasse PublicIP
      18. ''' </summary>
      19. Public Sub New()
      20. _wClient = New WebClient()
      21. _wClient.Proxy = Nothing
      22. End Sub
      23. ''' <summary>
      24. ''' Startet die Abfrage der öffentlichen IP.
      25. ''' </summary>
      26. Public Sub GetIP()
      27. _wClient.DownloadStringAsync(ServiceAddress)
      28. End Sub
      29. Private Sub _wClient_DownloadStringCompleted(ByVal sender As Object, ByVal e As DownloadStringCompletedEventArgs) Handles _wClient.DownloadStringCompleted
      30. If e.Error Is Nothing Then
      31. Dim ip As IPAddress = Nothing
      32. Dim ipString As String = e.Result.Split(New String() {": ", "</"}, StringSplitOptions.RemoveEmptyEntries)(3)
      33. If IPAddress.TryParse(ipString, ip) Then
      34. OnIPUpdateComplete(ip)
      35. Else
      36. OnIPUpdateError()
      37. End If
      38. Else
      39. OnIPUpdateError()
      40. End If
      41. End Sub
      42. Private Sub OnIPUpdateComplete(ByVal ip As IPAddress)
      43. RaiseEvent IPUpdateCompleted(Me, New IPUpdateEventArgs(ip))
      44. End Sub
      45. Private Sub OnIPUpdateError()
      46. RaiseEvent IPUpdateError(Me, EventArgs.Empty)
      47. End Sub
      48. End Class


      VB.NET-Quellcode

      1. Public Class IPUpdateEventArgs : Inherits EventArgs
      2. Public ReadOnly IPAddress As IPAddress
      3. Public Sub New(ByVal ip As IPAddress)
      4. Me.IPAddress = ip
      5. End Sub
      6. End Class


      Diese Klasse nutzt einen WebClient, um den HTML-QuellCode der o. g. ServiceAdresse herunterzuladen. Dies geschieht durch den Aufruf der Funktion GetIP, welche die Methode DownloadAsync des WebClienten nutzt. Die Async-Methode löst nach dem Abschluss der Anfrage ein Event aus. In diesem Event wird geprüft, ob die Anfrage fehlerfrei durchgeführt wurde. Trifft dies zu, so wird aus dem erhaltenen HTML-Code die öffentliche IP-Adresse extrahiert und das Event IPUpdateCompleted ausgelöst. Hier wird die IP-Adresse, gekapselt in den IpUpdateEventArgs, nach aussen geführt. Tritt ein Fehler bei der Anfrage auf oder wird eine nicht gültige IP-Adresse ausgegeben, so wird das Event IPUpdateError ausgelöst.

      Tritt ein Fehler regelmäßig auf, so ist damit zu rechnen, dass der Anbieter die Ausgabe der IP geändert oder den Service abgeschalten hat. Dies ist der Nachteil bei dieser Methode und der VB-QuellCode muss hier entsprechend angepasst oder auf einen anderen Anbieter gewechselt werden.

      Beispielcode, wie diese Klasse zu benutzen ist:

      VB.NET-Quellcode

      1. Public Class Form1
      2. Private WithEvents _ip As New PublicIP()
      3. Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
      4. _ip.GetIP()
      5. End Sub
      6. Private Sub _ip_IPUpdateCompleted(ByVal sender As Object, ByVal e As IPUpdateEventArgs) Handles _ip.IPUpdateCompleted
      7. Me.Label1.Text = e.IPAddress.ToString()
      8. End Sub
      9. Private Sub _ip_IPUpdateError(ByVal sender As Object, ByVal e As EventArgs) Handles _ip.IPUpdateError
      10. Me.Label1.Text = "Bei der Abfrage der öffentlichen IP trat ein Fehler auf."
      11. End Sub
      12. End Class


      Bei Fragen stehe ich gerne zur Verfügung. Sollte jemand einen Fehler im Code entdecken, bitte ich, dies zu melden....


      Have a nice day....


      Spacey!!!!

      25.08.2013: - Code ausgebessert (IPUpdateEventArgs).
      Dateien
      • PublicIP.zip

        (86,86 kB, 181 mal heruntergeladen, zuletzt: )
      Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
      Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o

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