C#: Traceroute via Konsole, WPF oder Forms

Nun folgt auch schon der letzte Beitrag der Netzwerk-Programmier-Reihe: Ping, Traceroute und DNSLookup. An dieser Stelle möchten wir Euch nun zeigen, wie ein windowsähnlicher Traceroute mit C# und dem .NET 3.5 umgesetzt wird. Dieses Programm bietet zusätzlich den Vorteil, dass es wesentlich schneller ein Ergebnis zurückliefert als das Windows-Pendant tracert.exe. Bisher konnten wir es noch nicht mit dem Linux-Pendant vergleichen, aber es sollte annähernd gleiche Geschwindigkeit erreichen. Unsere Tests erfolgten allerdings mit einer WPF-Oberfläche, die natürlich etwas ressourcenlastiger ist, als eine reine Konsolenanwendung.

Der Unterschied zu diesem Tutorial im Bereich der Netzwerkprogrammierung liegt lediglich darin, dass das hier gezeigte Snippet nicht so kurz ist, wie die anderen beiden, die wir bereits in der Tutorial-Sektion beschrieben haben. Dafür dürfte dies aber auch das nützlichste Tutorial von den insgesamt drei Hilfen sein.

// Einbinden der USINGs
using System.Text;
using System.Net;
using System.Net.NetworkInformation;
using System.Diagnostics;

///

/// Do a complete tracerout by calling this function.
/// 

///
ip adress or hostname
///
maximum number of hops
///
timeout in milliseconds
/// 
ip adress or hostname
///
maximum number of hops
///
timeout in milliseconds
/// A String containing the whole traceroute
public static string Traceroute(string ipAddressOrHostName, int maxHops, int timeout)
{
    // Instanzierung der IP-Adresse via Dns.GetHostEntry
    IPAddress ipAddress = Dns.GetHostEntry(ipAddressOrHostName).AddressList[0];

    // Wir benutzen vorerst der StringBuilder
    StringBuilder traceResults = new StringBuilder();

    // Um die einzelnen Stationen anzupingen
    using (Ping pingSender = new Ping())
    {
        PingOptions pingOptions = new PingOptions();

        // Holt uns nachher die Zeit (Stoppuhr)
        Stopwatch stopWatch = new Stopwatch();

        // Variablen deklarieren und Optionen setzen
        byte[] bytes = new byte[32];
        pingOptions.DontFragment = true;
        pingOptions.Ttl = 1;

        // Den StringBuilder füllen
        traceResults.AppendLine(

            // Formatierung des Strings
            string.Format(
                "Tracing route to {0} over a maximum of {1} hops:",
                ipAddress,
                maxHops));

        traceResults.AppendLine();

        // Die Anzahl an Hops (Sprüngen) durchlaufen
        for (int i = 1; i < maxHops + 1; i++)
        {
            // Zeitmessung resetten und dann starten
            stopWatch.Reset();
            stopWatch.Start();

            // Antwortet der Server
            PingReply pingReply = pingSender.Send(
                ipAddress,
                timeout,
                new byte[32], pingOptions);

            // Stoppuhr stoppen
            stopWatch.Stop();

            /* An dieser Stelle können wir nun den DNSLookup aus dem
             * vorherigen Tutorial einbinden. So sieht unser Ergebnis am
             * Ende aus, wie das der tracert.exe */
            string dns = DNSLookup(pingReply.Address.ToString());

            // Ergebnis im richtigen Format anfügen
            traceResults.AppendLine(
                string.Format("{0}\t{1} ms\t{2}\t{3}",
                i,
                stopWatch.ElapsedMilliseconds,
                pingReply.Address,
                dns));

            // Wenn der Ping erfolgreich war
            if (pingReply.Status == IPStatus.Success)
            {
                traceResults.AppendLine();
                traceResults.AppendLine("Trace complete."); break;
            }

            // Time To Live erhöhen
            pingOptions.Ttl++;
        }
    }

    // Return des Ergebnis-Strings
    return traceResults.ToString();
}

Wie Ihr sehen könnt, ist auch der Traceroute kein Hexenwerk. Letztenendes ist dies die Kombination aller drei vorherigen Tutorials, welches uns natürlich nun die verschiedensten Möglichkeiten zur Erweiterung bietet.

Wie im Code bereits an der entsprechenden Stelle markiert, wird auch hier die DNSLookup() Methode aufgerufen, welche den DNS des Servers aufschlüsselt. Wie bei allen Snippets und Tutorials, dürft Ihr Euch auch hier wieder gerne am Code bedienen!

  1. Chakko

    Funktioniert das auch für IPv6? bzw. kann man es für IPv6 erweitern ? :)

    Februar 16th, 2012 // Reply
  2. Heiko Fettsack

    Also hast du da was oder net

    Februar 22nd, 2012 // Reply
  3. Dustin Klein

    Bisher habe ich noch keinen Traceroute via IPv6 ausprobiert. Sobald ich in den nächsten Tagen mal zu etwas Ruhe komme, werde ich mir mal anschauen, wie man hier zum Erfolg kommt ;-)

    Februar 22nd, 2012 // Reply
  4. Chakko

    IPv6 funktioniert 1A :P sehr cool :)

    Februar 22nd, 2012 // Reply

Add your comment

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

*

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code lang=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" extra="">

THE SOURCE OF CODE DOMINATION