用程序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);
}
}
}