Csharp/C Sharp/Network/Ping
Содержание
Advanced Ping Program
<source lang="csharp"> /* 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); }
}
</source>
Ping and PingReply
<source lang="csharp"> using System; using System.Net.NetworkInformation; class MainClass {
public static void Main(string[] args) { using (Ping ping = new Ping()) { foreach (string comp in args) { try { Console.Write(" {0}...", comp); PingReply reply = ping.Send(comp, 100); if (reply.Status == IPStatus.Success) { Console.WriteLine("Success - IP Address:{0}", reply.Address, reply.RoundtripTime); } else { Console.WriteLine(reply.Status); } } catch (Exception ex) { Console.WriteLine("Error ({0})", ex.InnerException.Message); } } } }
}
</source>
Ping Success and Send
<source lang="csharp"> using System; using System.Net.NetworkInformation; class MainClass {
public static void Main(string[] args) { using (Ping ping = new Ping()) { Console.WriteLine("Pinging:"); foreach (string comp in args) { try { Console.Write(" {0}...", comp); PingReply reply = ping.Send(comp, 100); if (reply.Status == IPStatus.Success) { Console.WriteLine("Success - IP Address:{0}", reply.Address, reply.RoundtripTime); } else { Console.WriteLine(reply.Status); } } catch (Exception ex) { Console.WriteLine("Error ({0})", ex.InnerException.Message); } } } }
}
</source>
Simple Ping
<source lang="csharp"> /* C# Network Programming by Richard Blum Publisher: Sybex ISBN: 0782141765
- /
using System; using System.Net; using System.Net.Sockets; using System.Text; public class SimplePing {
public static void Main(string[] argv) { byte[] data = new byte[1024]; int recv; Socket host = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Icmp); IPEndPoint iep = new IPEndPoint(IPAddress.Parse(argv[0]), 0); EndPoint ep = (EndPoint)iep; ICMP packet = new ICMP(); packet.Type = 0x08; packet.Code = 0x00; packet.Checksum = 0; Buffer.BlockCopy(BitConverter.GetBytes((short)1), 0, packet.Message, 0, 2); Buffer.BlockCopy(BitConverter.GetBytes((short)1), 0, packet.Message, 2, 2); data = Encoding.ASCII.GetBytes("test packet"); Buffer.BlockCopy(data, 0, packet.Message, 4, data.Length); packet.MessageSize = data.Length + 4; int packetsize = packet.MessageSize + 4; UInt16 chcksum = packet.getChecksum(); packet.Checksum = chcksum; host.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 3000); host.SendTo(packet.getBytes(), packetsize, SocketFlags.None, iep); try { data = new byte[1024]; recv = host.ReceiveFrom(data, ref ep); } catch (SocketException) { Console.WriteLine("No response from remote host"); return; } ICMP response = new ICMP(data, recv); Console.WriteLine("response from: {0}", ep.ToString()); Console.WriteLine(" Type {0}", response.Type); Console.WriteLine(" Code: {0}", response.Code); int Identifier = BitConverter.ToInt16(response.Message, 0); int Sequence = BitConverter.ToInt16(response.Message, 2); Console.WriteLine(" Identifier: {0}", Identifier); Console.WriteLine(" Sequence: {0}", Sequence); string stringData = Encoding.ASCII.GetString(response.Message, 4, response.MessageSize - 4); Console.WriteLine(" data: {0}", stringData); host.Close(); }
} 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); }
}
</source>
Success
<source lang="csharp"> using System; using System.Net.NetworkInformation; class MainClass {
public static void Main(string[] args) { using (Ping ping = new Ping()) { Console.WriteLine("Pinging:"); foreach (string comp in args) { try { Console.Write(" {0}...", comp); PingReply reply = ping.Send(comp, 100); if (reply.Status == IPStatus.Success) { Console.WriteLine("Success - IP Address:{0}", reply.Address, reply.RoundtripTime); } else { Console.WriteLine(reply.Status); } } catch (Exception ex) { Console.WriteLine("Error ({0})", ex.InnerException.Message); } } } }
}
</source>