首页 网络安全 安全学院 查看内容

Ping实现代码(c#源码)

2009-10-22 09:41 726 0

摘要: // ping ***.***.***.*** using System;using System.IO;using System.Net;using System.Net.Sockets; na...
关键词: nbsp Index Length packet public Byte Buffer WriteLine code Console

// ping ***.***.***.*** using System;using System.IO;using System.Net;using System.Net.Sockets; namespace Ping{      /// <summary>     /// Ping 的摘要说明。     /// </summary>     ///          public class IcmpPacket     {         public Byte Type;               //消息类型;         public Byte SubCode;           //子类型代码         public UInt16 CheckSum;       //校验和         public UInt16 Identifier;     //标识         public UInt16 SequenceNumber; //序号         public Byte [] Data;           //数据包            }//class IcmPacket      class Ping     {         const int SOCKET_ERROR = -1;         const int ICMP_ECHO = 8;          /// <summary>         /// 应用程序的主入口点。         /// </summary>         [STAThread]         public static void Main(string[] argv)         {             //             // TODO: 在此处添加代码以启动应用程序             //             if(argv.Length == 0)             {                 Console.WriteLine("Usage:Ping <hostname> -t");                 Console.WriteLine("<hostname> The name of the Host who you want to ping");                 Console.WriteLine("-t Optional Switch to Ping the host continuously");                             }             else if(argv.Length == 1)             {                 PingHost(argv[0]);             }             else if(argv.Length == 2)             {                 if(argv[1] == "-t")                 {                     while(true)                     {                         PingHost(argv[0]);                      }                 }                 else                 {                     PingHost(argv[0]);                 }                               }             else             {               Console.WriteLine("Error in Arguments");              }          }         public static void PingHost(string host)         {             IPHostEntry serverHE,fromHE;             int nBytes = 0;             int dwStart = 0, dwStop = 0;             Socket socket = new Socket(AddressFamily.InterNetwork,SocketType.Raw,ProtocolType.Icmp);             try             {                 serverHE = Dns.GetHostByName(host);              }             catch(Exception)             {               Console.WriteLine("Host not found"); //fall                 return;             }              IPEndPoint ipepServer = new IPEndPoint(serverHE.AddressList[0],0);             EndPoint epServer=(ipepServer);             fromHE = Dns.GetHostByName(Dns.GetHostName());             IPEndPoint ipEndPointFrom = new IPEndPoint(fromHE.AddressList[0],0);             EndPoint EndPointFrom = (ipEndPointFrom);             int PacketSize = 0;             IcmpPacket packet = new IcmpPacket();             packet.Type = ICMP_ECHO; //8             packet.SubCode = 0;             packet.CheckSum = UInt16.Parse("0");             packet.Identifier = UInt16.Parse("45");             packet.SequenceNumber = UInt16.Parse("0");             int PingData = 32; //sizeof(IcmpPacket) -8;             packet.Data = new Byte[PingData];           //在数据中,写入指定的数据大小             for(int i = 0; i < PingData; i++ )                 packet.Data[i] = (byte)'#';             PacketSize = PingData + 8 ;                         Byte [] icmp_pkt_buffer = new byte[PacketSize];             Int32 Index = 0;             Index = Serialize(packet, icmp_pkt_buffer, PacketSize, PingData);              if(Index == -1)             {               Console.WriteLine("Error in Making Packet");                 return;             }              Double double_length = Convert.ToDouble(Index);             Double dtemp = Math.Ceiling(double_length / 2);             int cksum_buffer_length = Convert.ToInt32(dtemp);             UInt16 [] cksum_buffer = new UInt16[cksum_buffer_length];             int icmp_header_buffer_index = 0;              for(int i = 0;i<cksum_buffer_length; i++){             cksum_buffer[i] = BitConverter.ToUInt16(icmp_pkt_buffer,icmp_header_buffer_index);             icmp_header_buffer_index += 2;             }             UInt16 u_cksum = checksum (cksum_buffer,cksum_buffer_length);             packet.CheckSum = u_cksum;             Byte [] sendbuf = new Byte[PacketSize];             Index = Serialize(packet, sendbuf, PacketSize, PingData);             if(Index == -1)             {               Console.WriteLine("Error in Marking Packet");                 return;             }              dwStart = System.Environment.TickCount; // Start timing              if((nBytes = socket.SendTo(sendbuf, PacketSize, 0, epServer) ) == SOCKET_ERROR)             {               Console.WriteLine("Socket Error cannot Send Packet");             }             Byte [] ReceiveBuffer = new Byte[256];             nBytes = 0;             bool recd = false;             int timeout = 0;             while(!recd)             {               nBytes = socket.ReceiveFrom(ReceiveBuffer, 256,0,ref EndPointFrom);                 if(nBytes == SOCKET_ERROR)                 {                   Console.WriteLine("Host not Responding");                   recd = true;                     break;                 }             else if(nBytes > 0)                 {                     dwStop = System.Environment.TickCount - dwStart; //stop timing                     Console.WriteLine("Reply from "+epServer.ToString()+"in"+dwStop+"MS,\tBytes Received:"+nBytes);                     recd = true;                     break;                 }                 timeout = System.Environment.TickCount - dwStart;                 if(timeout > 1000)                 {                     Console.WriteLine("Time Out");                     recd = true;                 }             }             socket.Close();         }         public static Int32 Serialize(IcmpPacket packet, Byte[] Buffer, Int32 PacketSize, Int32 PingData)         {//初始化ICMP报文            Int32 cbReturn = 0;             int Index = 0;             Byte [] b_type = new Byte[1];             b_type[0] = (packet.Type);             Byte [] b_code = new Byte[1];             b_code[0] =(packet.SubCode);             Byte [] b_ckssum = BitConverter.GetBytes(packet.CheckSum);             Byte [] b_id = BitConverter.GetBytes(packet.Identifier);             Byte [] b_seq =   BitConverter.GetBytes(packet.SequenceNumber);             Array.Copy(b_code,0,Buffer,Index,b_type.Length);             Index += b_type.Length;             Array.Copy(b_code,0,Buffer,Index,b_code.Length);             Index += b_code.Length;             Array.Copy(b_code,0,Buffer,Index,b_ckssum.Length);             Index += b_ckssum.Length;             Array.Copy(b_code,0,Buffer,Index,b_id.Length);             Index += b_id.Length;             Array.Copy(b_code,0,Buffer,Index,b_seq.Length);             Index += b_seq.Length;             Array.Copy(b_code,0,Buffer,Index,PingData);             Index += PingData;              if( Index != PacketSize)             {               cbReturn = -1;                 return cbReturn;             }             cbReturn = Index;             return cbReturn;          }         public static UInt16 checksum(UInt16[] buffer,int size)         {         //将整个ICMP报文信息和数据转化为Byte数据包            Int32 cksum = 0;             int counter;             counter = 0;             while (size > 0)             {               UInt16 val = buffer[counter];                 cksum += Convert.ToInt32(buffer[counter]);                 counter += 1;                 size -= 1;              }             cksum = (cksum >> 16) + (cksum & 0xffff);             cksum += (cksum >> 16);             return (UInt16)(~cksum);         }     }}
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

最新评论

返回顶部