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!
Chakko
Funktioniert das auch für IPv6? bzw. kann man es für IPv6 erweitern ? :)
Heiko Fettsack
Also hast du da was oder net
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 ;-)
Chakko
IPv6 funktioniert 1A :P sehr cool :)
Dustin Klein
Na dann ist ja alles wunderbar :-)