用程序Ping. c#源码

用程序Ping. c#源码



// ping ***.***.***.***

using System;
using System.IO;
using System.Net;
using System.Net.Sockets;


namespace Ping
{

     /// 
     /// Ping 的摘要说明。
     /// 
     ///     
     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;

         /// 
         /// 应用程序的主入口点。
         /// 
         [STAThread]
         public static void Main(string[] argv)
         {
             //
             // TODO: 在此处添加代码以启动应用程序
             //
             if(argv.Length == 0)
             {
                 Console.WriteLine("Usage:Ping  -t");
                 Console.WriteLine(" 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 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);
         }
     }
}


留下回复