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.
Hi Feroze,
ReplyDeleteFirst of all, thank you VERY much for this posting, an excellent, and very useful piece on using Ping().
One note: I have found that, depending on one's network, line 35 can have a null reply.Address, yet the subsequent round passes can still work fine.
Protecting against this by surrounding lines 35 - 39 successfully bypasses using these round trips and let's the traceroute complete (providing the rest of the network elements are functioning, responding to the command, etc.).
Again, many thanks!
Best,
Dean
hi! Dean
ReplyDeleteThanks for your reply. I looked at the documentation for Ping.Send ( http://msdn.microsoft.com/en-us/library/hb7xxkfx(v=vs.110).aspx ) and did not find any mention for getting a NULL return object for Ping.Send(). So if you are getting a null object back, it is most likely a bug. Do you know how to reproduce that behavior?