Mega Code Archive

 
Categories / C# / Network
 

Advanced Ping Program

/* C# Network Programming  by Richard Blum Publisher: Sybex  ISBN: 0782141765 */ using System; using System.Drawing; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; using System.Windows.Forms; public class AdvPing : Form {    private static int pingstart, pingstop, elapsedtime;    private static TextBox hostbox, databox;    private static ListBox results;    private static Thread pinger;    private static Socket sock;    public AdvPing()    {       Text = "Advanced Ping Program";       Size = new Size(400, 380);       Label label1 = new Label();       label1.Parent = this;       label1.Text = "Enter host to ping:";       label1.AutoSize = true;       label1.Location = new Point(10, 30);       hostbox = new TextBox();       hostbox.Parent = this;       hostbox.Size = new Size(200, 2 * Font.Height);       hostbox.Location = new Point(10, 55);       results = new ListBox();       results.Parent = this;       results.Location = new Point(10, 85);       results.Size = new Size(360, 18 * Font.Height);       Label label2 = new Label();       label2.Parent = this;       label2.Text = "Packet data:";       label2.AutoSize = true;       label2.Location = new Point(10, 330);       databox = new TextBox();       databox.Parent = this;       databox.Text = "test packet";       databox.Size = new Size(200, 2 * Font.Height);       databox.Location = new Point(80, 325);       Button sendit = new Button();       sendit.Parent = this;       sendit.Text = "Start";       sendit.Location = new Point(220,52);       sendit.Size = new Size(5 * Font.Height, 2 * Font.Height);       sendit.Click += new EventHandler(ButtonSendOnClick);       Button stopit = new Button();       stopit.Parent = this;       stopit.Text = "Stop";       stopit.Location = new Point(295,52);       stopit.Size = new Size(5 * Font.Height, 2 * Font.Height);       stopit.Click += new EventHandler(ButtonStopOnClick);       Button closeit = new Button();       closeit.Parent = this;       closeit.Text = "Close";       closeit.Location = new Point(300, 320);       closeit.Size = new Size(5 * Font.Height, 2 * Font.Height);       closeit.Click += new EventHandler(ButtonCloseOnClick);       sock = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Icmp);       sock.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 3000);    }    void ButtonSendOnClick(object obj, EventArgs ea)    {       pinger = new Thread(new ThreadStart(sendPing));       pinger.IsBackground = true;       pinger.Start();    }    void ButtonStopOnClick(object obj, EventArgs ea)    {       pinger.Abort();    }    void ButtonCloseOnClick(object obj, EventArgs ea)    {       sock.Close();       Close();    }    void sendPing()    {       IPHostEntry iphe = Dns.Resolve(hostbox.Text);       IPEndPoint iep = new IPEndPoint(iphe.AddressList[0], 0);       EndPoint ep = (EndPoint)iep;       ICMP packet = new ICMP();       int recv, i = 1;       packet.Type = 0x08;       packet.Code = 0x00;       Buffer.BlockCopy(BitConverter.GetBytes(1), 0, packet.Message, 0, 2);       byte[] data = Encoding.ASCII.GetBytes(databox.Text);       Buffer.BlockCopy(data, 0, packet.Message, 4, data.Length);       packet.MessageSize = data.Length + 4;       int packetsize = packet.MessageSize + 4;       results.Items.Add("Pinging " + hostbox.Text);       while(true)       {          packet.Checksum = 0;          Buffer.BlockCopy(BitConverter.GetBytes(i), 0, packet.Message, 2, 2);          UInt16 chcksum = packet.getChecksum();          packet.Checksum = chcksum;          pingstart = Environment.TickCount;          sock.SendTo(packet.getBytes(), packetsize, SocketFlags.None, iep);          try          {             data = new byte[1024];             recv = sock.ReceiveFrom(data, ref ep);             pingstop = Environment.TickCount;             elapsedtime = pingstop - pingstart;             results.Items.Add("reply from: " + ep.ToString() + ", seq: " + i +                       ", time = " + elapsedtime + "ms");          } catch (SocketException)          {             results.Items.Add("no reply from host");          }          i++;          Thread.Sleep(3000);       }    }    public static void Main()    {       Application.Run(new AdvPing());    } } class ICMP {    public byte Type;    public byte Code;    public UInt16 Checksum;    public int MessageSize;    public byte[] Message = new byte[1024];    public ICMP()    {    }    public ICMP(byte[] data, int size)    {       Type = data[20];       Code = data[21];       Checksum = BitConverter.ToUInt16(data, 22);       MessageSize = size - 24;       Buffer.BlockCopy(data, 24, Message, 0, MessageSize);    }    public byte[] getBytes()    {       byte[] data = new byte[MessageSize + 9];       Buffer.BlockCopy(BitConverter.GetBytes(Type), 0, data, 0, 1);       Buffer.BlockCopy(BitConverter.GetBytes(Code), 0, data, 1, 1);       Buffer.BlockCopy(BitConverter.GetBytes(Checksum), 0, data, 2, 2);       Buffer.BlockCopy(Message, 0, data, 4, MessageSize);       return data;    }    public UInt16 getChecksum()    {       UInt32 chcksm = 0;       byte[] data = getBytes();       int packetsize = MessageSize + 8;       int index = 0;       while ( index < packetsize)       {          chcksm += Convert.ToUInt32(BitConverter.ToUInt16(data, index));          index += 2;       }       chcksm = (chcksm >> 16) + (chcksm & 0xffff);       chcksm += (chcksm >> 16);       return (UInt16)(~chcksm);    } }