Implementing Traceroute with System.Net Part III
Implementing Traceroute with System.Net Part II
Implementing Traceroute with System.Net Part I
It turns out, that System.Net.NetworkInformation already has a Ping class, that encapsulates all the functionality of sending ICMP ECHO requests and processing replies. It has the necessary switches to tweak the TTL settings as well.
I wrote a small program to demonstrate how we can do a Traceroute using the Ping class.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using System.Net.Sockets; using System.Net.NetworkInformation; namespace PingClassTest { class Program { static void Main(string[] args) { Ping pinger = new Ping(); String data = "0123456789ABCDEF"; byte[] buffer = Encoding.ASCII.GetBytes(data); PingOptions options = new PingOptions(); IPHostEntry target = Dns.GetHostEntry(args[0]); bool isDestination = false; for(int i = 1; i <= 30; i++) { String intermediateHost = null; for (int j = 0; j < 3; j++) { options.Ttl = i; PingReply reply = pinger.Send(target.AddressList[0], 30, buffer, options); switch (reply.Status) { case IPStatus.TimedOut: case IPStatus.TtlExpired: case IPStatus.Success: Console.Write("<{0}ms\t", reply.RoundtripTime); if (reply.Address.Equals(target.AddressList[0])) { isDestination = true; } intermediateHost = reply.Address.ToString(); break; default: Console.Write("*\t"); break; } } Console.WriteLine("\t{0}", intermediateHost); if (isDestination) { break; } }javascript:void(0) } pinger.Dispose(); } }The output of this program, when pinging www.yahoo.com is as follows:
<0ms <0ms <0ms 192.168.1.1 <0ms <0ms <0ms 98.117.116.1 <0ms <0ms <0ms 130.81.138.218 <0ms <0ms <0ms 130.81.28.166 <0ms <0ms <0ms 130.81.17.56 <0ms <0ms <0ms 130.81.17.231 <0ms <0ms <0ms 130.81.14.90 <0ms <0ms <0ms 216.115.107.57 <0ms <0ms <0ms 209.131.32.23 <27ms <26ms <26ms 209.131.36.158 Press any key to continue . . .As you can see, this program gives the exact same functionality as the program that we wrote using the Socket class. The Ping class also supports asynchronous functionality which makes it very useful for high performance applications.