vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
vb@rchiv Offline-Reader - exklusiv auf der vb@rchiv CD Vol.4  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück
Rubrik: HTML/Internet/Netzwerk · Internet / Browser / IE   |   VB-Versionen: VB.NET27.07.06
TraceRoute - Internet Zielverfolgung (VB 2005)

Dieses Klassenmodul protokolliert die "Route" des TCP/IP-Protokolls zu einer angegebenen Internetadresse.

Autor:   Roland WutzkeBewertung:     [ Jetzt bewerten ]Views:  15.558 
www.vb-power.netSystem:  WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 Beispielprojekt auf CD 

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.
Roland Wutzke
 

Dieser Tipp wurde bereits 15.558 mal aufgerufen.

Voriger Tipp   |   Zufälliger Tipp   |   Nächster Tipp

Über diesen Tipp im Forum diskutieren
Haben Sie Fragen oder Anregungen zu diesem Tipp, können Sie gerne mit anderen darüber in unserem Forum diskutieren.

Neue Diskussion eröffnen

nach obenzurück


Anzeige

Kauftipp Unser Dauerbrenner!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.
 
   

Druckansicht Druckansicht Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
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.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel