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
Diese Klasse nutzt einen WebClient, um den HTML-QuellCode der o. g. ServiceAdresse herunterzuladen. Dies geschieht durch den Aufruf der Funktion
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:
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).
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
- Imports System.Net
- Public Class PublicIP
- ''' <summary>
- ''' Die Sericeadresse, von der die IP abgefragt wird.
- ''' </summary>
- Public Property ServiceAddress As Uri = New Uri("http://checkip.dyndns.com/")
- Private WithEvents _wClient As WebClient
- ''' <summary>
- ''' Wird ausgelöst, wenn die Abfrage der IP erfolgreich war.
- ''' </summary>
- Public Event IPUpdateCompleted As EventHandler(Of IPUpdateEventArgs)
- ''' <summary>
- ''' Wird ausgelöst, wenn bei der Abfrage der IP ein Fehler auftritt.
- ''' </summary>
- Public Event IPUpdateError As EventHandler
- ''' <summary>
- ''' Erzeugt eine neue Instanz der Klasse PublicIP
- ''' </summary>
- Public Sub New()
- _wClient = New WebClient()
- _wClient.Proxy = Nothing
- End Sub
- ''' <summary>
- ''' Startet die Abfrage der öffentlichen IP.
- ''' </summary>
- Public Sub GetIP()
- _wClient.DownloadStringAsync(ServiceAddress)
- End Sub
- Private Sub _wClient_DownloadStringCompleted(ByVal sender As Object, ByVal e As DownloadStringCompletedEventArgs) Handles _wClient.DownloadStringCompleted
- If e.Error Is Nothing Then
- Dim ip As IPAddress = Nothing
- Dim ipString As String = e.Result.Split(New String() {": ", "</"}, StringSplitOptions.RemoveEmptyEntries)(3)
- If IPAddress.TryParse(ipString, ip) Then
- OnIPUpdateComplete(ip)
- Else
- OnIPUpdateError()
- End If
- Else
- OnIPUpdateError()
- End If
- End Sub
- Private Sub OnIPUpdateComplete(ByVal ip As IPAddress)
- RaiseEvent IPUpdateCompleted(Me, New IPUpdateEventArgs(ip))
- End Sub
- Private Sub OnIPUpdateError()
- RaiseEvent IPUpdateError(Me, EventArgs.Empty)
- End Sub
- 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
- Public Class Form1
- Private WithEvents _ip As New PublicIP()
- Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
- _ip.GetIP()
- End Sub
- Private Sub _ip_IPUpdateCompleted(ByVal sender As Object, ByVal e As IPUpdateEventArgs) Handles _ip.IPUpdateCompleted
- Me.Label1.Text = e.IPAddress.ToString()
- End Sub
- Private Sub _ip_IPUpdateError(ByVal sender As Object, ByVal e As EventArgs) Handles _ip.IPUpdateError
- Me.Label1.Text = "Bei der Abfrage der öffentlichen IP trat ein Fehler auf."
- End Sub
- 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).
Die Unendlichkeit ist weit. Vor allem gegen Ende.
Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken.
Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken.
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „SpaceyX“ ()