PING / Trace Route - Open Source - C# (C-sharp)
Application Demo
// 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;
}
}
}