Jim Scott's Coding Blog

It's all about that code, that code, that code, no treble

C# Traceroute using .net framework

If you have ever tried to create a traceroute program using one of the few available ICMP libraries freely available for C# you may have run into some issues mainly to do with the ICMP checksum not being correct. It seems that as of .NET 2.0 framework that microsoft included a Ping class that makes it really easy to then use it to create a traceroute utility. Here is some basic code to create a traceroute utility.

public string Traceroute(string ipAddressOrHostName)
{
    IPAddress ipAddress = Dns.GetHostEntry(ipAddressOrHostName).AddressList[0];
    StringBuilder traceResults = new StringBuilder();
 
    using(Ping pingSender = new Ping())
    {
        PingOptions pingOptions = new PingOptions();
        Stopwatch stopWatch = new Stopwatch();
        byte[] bytes = new byte[32];
 
        pingOptions.DontFragment = true;
        pingOptions.Ttl = 1;
        int maxHops = 30;
 
 
 
        traceResults.AppendLine(
            string.Format(
                "Tracing route to {0} over a maximum of {1} hops:", 
                ipAddress, 
                maxHops));
 
        traceResults.AppendLine();
 
        for(int i = 1; i < maxHops + 1; i++)
        {
            stopWatch.Reset();
            stopWatch.Start();
            PingReply pingReply = pingSender.Send(
                ipAddress, 
                5000, 
                new byte[32], pingOptions);
 
            stopWatch.Stop();
 
            traceResults.AppendLine(
                string.Format("{0}\t{1} ms\t{2}", 
                i, 
                stopWatch.ElapsedMilliseconds, 
                pingReply.Address));
 
            if(pingReply.Status == IPStatus.Success)
            {
                traceResults.AppendLine();
                traceResults.AppendLine("Trace complete."); break;
            }
 
            pingOptions.Ttl++;
        }
 
    }
 
    return traceResults.ToString();
}

Comments (5) -

  • none

    10/20/2009 11:47:44 AM | Reply

    thanks! just what I was looking for

  • chachunasayan

    5/5/2012 5:56:00 PM | Reply

    Thanks for your code I'm using it in my asp.net application, the code runs fine when I'm testing in on my PC (localhost), but when the application is uploaded to a web server, the traceroute prints only ttls e.g.,:

    1  5555ms
    2  5244ms
    .. and so on.

    Can you kindly guide me as to what the problem can be?

  • Marius Musat

    1/10/2013 9:25:57 AM | Reply

    i wonder why if you trace route on a hostname it returns some macs or something while doing it on ips works fine

  • RobRdam

    3/4/2013 1:24:05 AM | Reply

    For those who are like me not familiar with the Stopwatch function: it's in the System.Diagnostics class, so either create a using statement or precede the Stopwatch creation with System.Diagnostics.

    Thanks for the code!

  • jscott

    3/4/2013 10:36:54 AM | Reply

    RobRdam, thanks for the comment. I will fixup the code example so that it shows all the using statements and makes it easier to copy and paste the code as I had an issue myself just now trying to get the code example out Wink

Pingbacks and trackbacks (1)+

Loading