Ist Ihnen bewusst, welchen Weg Ihre Internetanfrage nimmt, wenn Sie bspw. das vb@rchiv besuchen? Dafür verantwortlich ist das TCP/IP Protokoll. Es ist so flexibel, dass es sich selbstständig die Route zum Ziel sucht, wobei die Route nicht immer den gleichen Weg nehmen muss. Dabei geht sie über mehrere Knoten (Hops) bis zum Zielhost. Fällt auf dem Weg zum Ziel einer dieser Knoten aus, dann sucht sich das Protokoll automatische eine alternative Route. Den Weg bis zum Ziel, also über welche Knoten Ihren Anfrage läuft, kann man ermitteln. Eine solche Zielsuche nennt man TraceRoute. Windows stellt uns mit dem Kommandozeilen Programm "TraceRT" ein solches Werkzeug zur Verfügung. Nun könnte man meinen, TraceRoute ist ein Service oder Internet Protokoll. Nein, ist es nicht - TraceRoute wird mit einem simplen Ping ermittelt. Aber wie wird es nun gemacht? Dazu müssen wir uns die Ping Optionen einmal näher betrachten: Die Optionen beinhalten die Eigenschaft TTL (Time To Live). Diese Eigenschaft bestimmt, über wie viele Knoten ein Ping läuft bis er automatisch terminiert wird, falls er das Ziel vorher nicht erreicht hat. Der letzte Knoten, der den Ping terminiert, gibt eine Meldung an den Sender zurück. Die Rückmeldung beinhaltet u.a. die IP-Adresse des Knotens. Lassen wir den Ping in einer Schleife laufen, und erhöhen bei jedem Durchlauf den TTL-Wert um eins, so erhalten wir die Route bis zum Ziel. Und genau das macht die nachfolgende VB.Net 2005 Klasse clsTraceRoute. Die Klasse stellt Ihnen die überladene Methode "TraceRT", sowie mehrere Eigenschaften und Ereignisse zur Verfügung. Option Explicit On Option Strict On Imports System.Net ''' <summary> ''' Die Klasse stellt eine TraceRoute Zielsuche zur Verfügung. ''' </summary> ''' <remarks> ''' VB.Net 2005 Klassenmodul ''' Diese Klasse stellt eine TraceRoute Internet Zielsuche zur ''' Verfügung. Die Routenverfolgung wird dabei über die Ping ''' Klasse aus System.Net.NetworkInformation realisiert. Dabei ''' wird in einer Schleife die TTL (Time To Live) Eigenschaft ''' aus den PingOptions jeweils um eins erhöht, bis der Zielhost ''' erreicht, oder MaxHops überschritten wird. ''' ''' Juli 2006 - VB-Power.net ''' http://www.vb-power.net ''' </remarks> Public Class clsTraceRoute ''' <summary> ''' Datenklasse - enthält ein Knoten der Zielsuche. ''' </summary> Class TraceRTArgs Implements ICloneable Friend IPAddress As String Friend DNSName As String Friend RoundTripTime As Long Friend Buffer As Byte() Friend Status As String ''' <summary> ''' Erstellt eine Kopie der Datenklasse. ''' </summary> Public Function Clone() As Object Implements System.ICloneable.Clone Return Me.MemberwiseClone End Function End Class ' Buffer-Konstante Private Const sBuffer As String = "ReturnToSenderClassTraceRoute" ' Private Variablen der Klasse Private m_Buffer() As Byte = System.Text.Encoding.Default.GetBytes(sBuffer) Private m_MaxHops As Integer = 30 Private m_Timeout As Integer = 500 Private m_RouteList As New List(Of TraceRTArgs) ' Events der Klasse Public Event ReturnRouteNode(ByVal HopNum As Integer, _ ByVal e As TraceRTArgs, ByRef Cancel As Boolean) Public Event TraceRTDone(ByVal HostReached As Boolean, _ ByVal RouteList As List(Of TraceRTArgs)) Public Event HostInfo(ByVal HostName As String, _ ByVal IPAddress As String) ''' <summary> ''' Setzt den Ping-Reply Buffer, oder liest ihn aus. ''' </summary> Public Property Buffer() As Byte() Get Return m_Buffer End Get Set(ByVal value As Byte()) Try m_Buffer = value Catch ex As Exception Throw ex End Try End Set End Property ''' <summary> ''' Legt die max. Anzahl von Knoten bei der Zielsuche fest. ''' </summary> Public Property MaxHops() As Integer Get Return m_MaxHops End Get Set(ByVal value As Integer) m_MaxHops = value End Set End Property ''' <summary> ''' Setzt den Timeout für die Knoten bei der Zielsuche. ''' </summary> Public Property Timeout() As Integer Get Return m_Timeout End Get Set(ByVal value As Integer) m_Timeout = value End Set End Property ''' <summary> ''' Gibt die Route der Zielsuche zurück. ''' </summary> Public ReadOnly Property RouteList() As List(Of TraceRTArgs) Get Return m_RouteList End Get End Property ''' <summary> ''' Startet die Zielsuche zum angegebenen Host. ''' </summary> ''' <param name="Host">Die IP-Adresse oder der DNS-Name des Ziels</param> Public Sub TraceRT(ByVal Host As String) Me.TraceRoute(Host, True) End Sub ''' <summary> ''' Startet die Zielsuche zum angegebenen Host. ''' </summary> ''' <param name="Host">Die IP-Adresse oder der DNS-Name des Ziels</param> ''' <param name="ResolveDNS">Bestimmt, ob der DNS-Name der Knoten ''' ermittelt werden soll.</param> Public Sub TraceRT(ByVal Host As String, ByVal ResolveDNS As Boolean) Me.TraceRoute(Host, ResolveDNS) End Sub ''' <summary> ''' Die eigentliche Zielsuche ''' </summary> Private Sub TraceRoute(ByVal Host As String, ByVal ResolveDNS As Boolean) Dim Ping, P1 As New NetworkInformation.Ping Dim PingOption As New NetworkInformation.PingOptions Dim PingReply, R1 As NetworkInformation.PingReply Dim isHostReached As Boolean = False Try ' Die IP-Addresse des Zielhosts ermitteln Dim i As IPHostEntry = Dns.GetHostEntry(Host) Dim ip As IPAddress = i.AddressList(0) ' Event HostInfo in die aufrufende Form feuern. RaiseEvent HostInfo(i.HostName, i.AddressList(0).ToString) ' RouteList löschen m_RouteList.Clear() ' Schleife über die max. Anzahl von ' Knoten bei der Zielsuche. For x As Integer = 1 To m_MaxHops Dim isCancel As Boolean = False Dim Ret As New TraceRTArgs ' Ping-Optionen setzen und Ping auslösen PingOption.Ttl = x PingOption.DontFragment = False PingReply = Ping.Send(ip, m_Timeout, m_Buffer, PingOption) ' Konnte ein Knoten erreicht werden? If Not PingReply.Address Is Nothing Then ' Die Return-Klasse(TraceRTArgs) füllen With Ret .Buffer = PingReply.Buffer .IPAddress = PingReply.Address.ToString .Status = PingReply.Status.ToString ' Prüfen, ob der letzte Knoten den Ping Aufgrund ' des TTL (Time To Live) Werts verworfen hat. If .Status.ToUpper.Equals("TTLEXPIRED") Then Try ' Benötigte Zeit bis zum letzten Knoten ermitteln R1 = P1.Send(.IPAddress, m_Timeout) .RoundTripTime = R1.RoundtripTime Catch : End Try Else .RoundTripTime = PingReply.RoundtripTime End If ' DNS-Name des letzten Knoten ermitteln If ResolveDNS Then Try Dim d As IPHostEntry = Dns.GetHostEntry(PingReply.Address.ToString) .DNSName = d.HostName Catch ex As Exception .DNSName = "unresolved" End Try End If End With ' Return Klasse(TraceRTArgs) in die List(Of) schieben m_RouteList.Add(CType(Ret.Clone, TraceRTArgs)) ' Event in die aufrufende Form feuern. Dabei wird die ' letzte Knotennummer, die Return-Klasse und die ' Abbruchbedingung übergeben. RaiseEvent ReturnRouteNode(x, Ret, isCancel) Application.DoEvents() ' Wurde der Zielhost erreicht? Wenn Ja, dann Schleife verlassen. If PingReply.Status.ToString.ToUpper.Equals("SUCCESS") Then isHostReached = True Exit For End If ' User-Abbruchbedingung prüfen und ggf. Schleife verlassen. If isCancel Then isHostReached = False Exit For End If Else ' Der letzte Knoten konnte nicht erreicht werden. Ret.Status = PingReply.Status.ToString m_RouteList.Add(CType(Ret.Clone, TraceRTArgs)) RaiseEvent ReturnRouteNode(x, Ret, isCancel) Application.DoEvents() If isCancel Then isHostReached = False Exit For End If End If Next ' Schleifendurchlauf beendet. Event feuern und dabei ' die RouteList zurückgeben. RaiseEvent TraceRTDone(isHostReached, m_RouteList) Catch ex As NetworkInformation.PingException Throw ex Catch ex As Sockets.SocketException Throw ex Catch ex As Exception Throw ex Finally Ping.Dispose() P1.Dispose() End Try End Sub End Class Wie Sie sehen können, ist es gar nicht so schwierig... Unser Demoprojekt zeigt Ihnen, wie die Methoden, Eigenschaften und Ereignisse der Klasse genutzt werden können. Viel Spaß auf der Suche zum Ziel. Dieser Tipp wurde bereits 15.558 mal aufgerufen. Voriger Tipp | Zufälliger Tipp | Nächster Tipp
Anzeige
Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv Vol.6 (einschl. Beispielprojekt!) Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv! - nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten - Symbol-Galerie mit mehr als 3.200 Icons im modernen Look Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m. |
sevAniGif (VB/VBA) Anzeigen von animierten GIF-Dateien Ab sofort lassen sich auch unter VB6 und VBA (Access ab Version 2000) animierte GIF-Grafiken anzeigen und abspielen, die entweder lokal auf dem System oder auf einem Webserver gespeichert sind. Tipp des Monats März 2024 Dieter Otter UTF-8 Konvertierung von Dateien und Strings VB6 selbst verfügt über keine Funktionen zur UTF-8 Konvertierung von Daten. Mit Hilfe des ADODB.Stream-Objekts lassen sich diese fehlenden Funktionen aber schnell nachrüsten. Access-Tools Vol.1 Über 400 MByte Inhalt Mehr als 250 Access-Beispiele, 25 Add-Ins und ActiveX-Komponenten, 16 VB-Projekt inkl. Source, mehr als 320 Tipps & Tricks für Access und VB |
||||||||||||||||
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein. |