digigrupp.com       Home  Downloads  Support  About  Contact  Search 

PING / Trace Route - Open Source - C# (C-sharp)

Downloadmain.csip.csicmp.csicmpsocket.cscompile.cmd  

Demo Application

// Author: Toomas Kaljus
// http://www.digigrupp.com

namespace DG
{
    public class Application
    {
        public static int Main(string[] args)
        {
            int PacketSize = 32; // set ping packet size (minimum = 0; sensible maximum = 1024; common = 32)
            string Host = "localhost";
            if (args.Length > 0) Host = args[0];

            ICMPSocket Socket = new ICMPSocket();

            // ping
            System.Console.WriteLine();
            System.Console.WriteLine("Pinging " + Host + " with " + PacketSize + " bytes of data:");
            System.Console.WriteLine();
            System.Random Random = new System.Random();
            ICMPPacket ICMP = new ICMPPacket();
            ICMPEcho Message = new ICMPEcho();
            ICMP.Message = Message;
            for (ushort pc=1; pc<5; pc++) {
                if (pc > 0) System.Threading.Thread.Sleep(500);
                Message.Identifier = (ushort)Random.Next(0, 0xffff);
                Message.SequenceNumber = pc;
                Message.Data = "".PadRight(PacketSize, '*');
                try {
                    IPPacket IP = Socket.Send(Host, ICMP, 128);
                    if (IP.ICMP.Message is ICMPEchoReply)
                        System.Console.WriteLine("Reply from " + Socket.EndPoint.ToString() + ": bytes=" + ((ICMPEchoReply)IP.ICMP.Message).Data.Length + " time=" + Socket.TimeElapsed + "ms TTL=" + IP.TimeToLive);
                    else if (IP.ICMP.Message is ICMPTimeExceeded)
                        System.Console.WriteLine("Reply from " + Socket.EndPoint.ToString() + ": Time Exceeded");
                    else if (IP.ICMP.Message is ICMPDestinationUnreachable)
                        System.Console.WriteLine("Reply from " + Socket.EndPoint.ToString() + ": Destination Unreachable");
                    else
                        System.Console.WriteLine("Reply from " + Socket.EndPoint.ToString() + ": " + IP.ICMP.Message);
                } catch {
                    System.Console.Error.WriteLine("Request timed out");
                }
            }
            System.Console.WriteLine();

            // traceroute
            int MaxHops = 30;
            bool TraceOk = false;
            int ErrorCount = 0;
            System.Console.WriteLine();
            System.Console.WriteLine("Tracing route to " + Host + " over a maximum of " + MaxHops + " hops:");
            System.Console.WriteLine();
            for (int TTL = 1; TTL < MaxHops + 1; TTL++) {
                string ResponseHost = "";
                string ResponseError = "";
                ICMP = new ICMPPacket();
                Message = new ICMPEcho();
                ICMP.Message = Message;
                System.Console.Write(TTL.ToString().PadLeft(3) + " ");
                for (ushort pc=1; pc<4; pc++) {
                    if (pc > 0) System.Threading.Thread.Sleep(500);
                    Message.Identifier = 1;
                    Message.SequenceNumber = pc;
                    Message.Data = "".PadRight(PacketSize, '*');
                    try {
                        IPPacket IP = Socket.Send(Host, ICMP, TTL);
                        if (ResponseHost == "") {
                            string ResponseAddress = ((System.Net.IPEndPoint)Socket.EndPoint).Address.ToString();
#if NET20
                            try {
                                ResponseHost = System.Net.Dns.GetHostEntry(ResponseAddress).HostName;
                            } catch { }
#else
                            ResponseHost = System.Net.Dns.Resolve(ResponseAddress).HostName;
#endif
                            if (ResponseHost != ResponseAddress) ResponseHost += " [" + ResponseAddress + "]";
                        }
                        if (IP.ICMP.Message is ICMPTimeExceeded) {
                            System.Console.Write(Socket.TimeElapsed.ToString().PadLeft(5) + " ms ");
                        } else
                        if (IP.ICMP.Message is ICMPEchoReply) {
                            System.Console.Write(Socket.TimeElapsed.ToString().PadLeft(5) + " ms ");
                            TraceOk = true;
                        } else
                        if (IP.ICMP.Message is ICMPIPHeaderReply) {
                            ResponseError = " reports " + IP.ICMP.Message;
                            TraceOk = true;
                            break;
                        }
                        ErrorCount = 0;
                    } catch {
                        System.Console.Write("*".PadLeft(5) + " ");
                        ErrorCount++;
                    }
                }
                System.Console.WriteLine(ResponseHost + ResponseError);
                if (TraceOk) break;
                if (ErrorCount > 8) break;
            }
            System.Console.WriteLine();
            System.Console.WriteLine("Trace complete.");
            System.Console.WriteLine();
             return 0;
        }
    }
}