namespace Cornfield
{
using System;
using System.Net;
using System.Net.Sockets;
class MyPing
{
public static void Main(string[] argv)
{
if(argv.Length==1 || argv.Length==2)
PingHost(argv);
else
{
Console.WriteLine("Invalid Command.");
Console.WriteLine("Usage : 1. MyPing <hostname>.") ;
Console.WriteLine(" 2. MyPing <hostname> <client>.");
}
}
public static void PingHost(string[] hostclient)
{
//初始化Socket套接字
//三个参数分别为:
// 1。解析地址的地址模式,较常用的为AddressFamily.InterNetwork,即IPv4地址。
// 2。Socket套接字类型,一般为SocketType.Raw原始类型。
// 3。网络协议类型,这里Ping用的是Internet控制报文协议ProtocolType.Icmp.
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Icmp);
IPHostEntry hostInfo;
try
{
//解析主机IP入口
hostInfo = Dns.GetHostByName(hostclient[0]);
}
catch(Exception)
{
//解析主机名错误。
Console.WriteLine("Unknown host {0}.",hostclient[0]);
return ;
}
// 取主机0号端口
EndPoint hostPoint= (EndPoint)new IPEndPoint(hostInfo.AddressList[0], 0);
IPHostEntry clientInfo;
try
{
if (hostclient.Length==2)
clientInfo =Dns.GetHostByName(hostclient[1]);
else
clientInfo = Dns.GetHostByName(Dns.GetHostName());
}
catch(Exception)
{
//解析主机名错误。
Console.WriteLine("Unknown client {1}.",hostclient[1]);
return ;
}
// 取客户机0号端口
//********************************注意******************************
//这里当然可以设置为本地机或其它主机的IP,那样报文将返回到该机IP端口,
//实际上这是黑客们惯用的手段之一,即利用报文协议来攻击远程主机
//便是利用这样的原理,加上多个无限次的报文攻击即可时远程主机瘫痪
//对于将本程序利用于非法的攻击活动,笔者概不负责!!!!!!!!!!!!!!!!
//******************************************************************
EndPoint clientPoint = (EndPoint)new IPEndPoint(clientInfo.AddressList[0], 0);
//设置ICMP报文
int DataSize = 32; // ICMP数据包大小;
int PacketSize = DataSize + 8;//总报文长度
const int ICMP_ECHO = 8;
IcmpPacket packet = new IcmpPacket(ICMP_ECHO,0,0,45,0,DataSize);
Byte [] Buffer = new Byte[ PacketSize ];
int index=packet.ConvertToByte(Buffer);
//报文出错
if( index != PacketSize)
{
Console.WriteLine("There is something wrong with Packet Data !");
return ;
}
int cksum_buffer_length =(int)Math.Ceiling( ((Double)index)/ 2);
UInt16 [] cksum_buffer = new UInt16[cksum_buffer_length];
int icmp_header_buffer_index = 0;
for( int i = 0; i < cksum_buffer_length; i++ )
{
//将两个byte转化为一个UInt16
cksum_buffer[i] = BitConverter.ToUInt16(Buffer,icmp_header_buffer_index);
icmp_header_buffer_index += 2;
}
//将校验和保存至报文里
packet.CheckSum =IcmpPacket.SumOfCheck(cksum_buffer);
// 保存校验和后,再次将报文转化为数据包
Byte [] SendData = new Byte[ PacketSize ];
index= packet.ConvertToByte(SendData);
//报文出错
if( index != PacketSize)
{
Console.WriteLine("There is something wrong with Packet Data !");
return ;
}
int nBytes=0;
//系统计时开始
int startTime = Environment.TickCount;
//发送数据包
if ((nBytes = socket.SendTo(SendData, PacketSize, SocketFlags.None,(EndPoint) hostPoint)) == -1)
{
Console.WriteLine("Socket can not send packet");
}
Byte [] ReceiveData = new Byte[256]; //接收数据
nBytes = 0;
int timeout=0 ;
int timeConsume=0;
while(true)
{
{
using System;
using System.Net;
using System.Net.Sockets;
class MyPing
{
public static void Main(string[] argv)
{
if(argv.Length==1 || argv.Length==2)
PingHost(argv);
else
{
Console.WriteLine("Invalid Command.");
Console.WriteLine("Usage : 1. MyPing <hostname>.") ;
Console.WriteLine(" 2. MyPing <hostname> <client>.");
}
}
public static void PingHost(string[] hostclient)
{
//初始化Socket套接字
//三个参数分别为:
// 1。解析地址的地址模式,较常用的为AddressFamily.InterNetwork,即IPv4地址。
// 2。Socket套接字类型,一般为SocketType.Raw原始类型。
// 3。网络协议类型,这里Ping用的是Internet控制报文协议ProtocolType.Icmp.
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Icmp);
IPHostEntry hostInfo;
try
{
//解析主机IP入口
hostInfo = Dns.GetHostByName(hostclient[0]);
}
catch(Exception)
{
//解析主机名错误。
Console.WriteLine("Unknown host {0}.",hostclient[0]);
return ;
}
// 取主机0号端口
EndPoint hostPoint= (EndPoint)new IPEndPoint(hostInfo.AddressList[0], 0);
IPHostEntry clientInfo;
try
{
if (hostclient.Length==2)
clientInfo =Dns.GetHostByName(hostclient[1]);
else
clientInfo = Dns.GetHostByName(Dns.GetHostName());
}
catch(Exception)
{
//解析主机名错误。
Console.WriteLine("Unknown client {1}.",hostclient[1]);
return ;
}
// 取客户机0号端口
//********************************注意******************************
//这里当然可以设置为本地机或其它主机的IP,那样报文将返回到该机IP端口,
//实际上这是黑客们惯用的手段之一,即利用报文协议来攻击远程主机
//便是利用这样的原理,加上多个无限次的报文攻击即可时远程主机瘫痪
//对于将本程序利用于非法的攻击活动,笔者概不负责!!!!!!!!!!!!!!!!
//******************************************************************
EndPoint clientPoint = (EndPoint)new IPEndPoint(clientInfo.AddressList[0], 0);
//设置ICMP报文
int DataSize = 32; // ICMP数据包大小;
int PacketSize = DataSize + 8;//总报文长度
const int ICMP_ECHO = 8;
IcmpPacket packet = new IcmpPacket(ICMP_ECHO,0,0,45,0,DataSize);
Byte [] Buffer = new Byte[ PacketSize ];
int index=packet.ConvertToByte(Buffer);
//报文出错
if( index != PacketSize)
{
Console.WriteLine("There is something wrong with Packet Data !");
return ;
}
int cksum_buffer_length =(int)Math.Ceiling( ((Double)index)/ 2);
UInt16 [] cksum_buffer = new UInt16[cksum_buffer_length];
int icmp_header_buffer_index = 0;
for( int i = 0; i < cksum_buffer_length; i++ )
{
//将两个byte转化为一个UInt16
cksum_buffer[i] = BitConverter.ToUInt16(Buffer,icmp_header_buffer_index);
icmp_header_buffer_index += 2;
}
//将校验和保存至报文里
packet.CheckSum =IcmpPacket.SumOfCheck(cksum_buffer);
// 保存校验和后,再次将报文转化为数据包
Byte [] SendData = new Byte[ PacketSize ];
index= packet.ConvertToByte(SendData);
//报文出错
if( index != PacketSize)
{
Console.WriteLine("There is something wrong with Packet Data !");
return ;
}
int nBytes=0;
//系统计时开始
int startTime = Environment.TickCount;
//发送数据包
if ((nBytes = socket.SendTo(SendData, PacketSize, SocketFlags.None,(EndPoint) hostPoint)) == -1)
{
Console.WriteLine("Socket can not send packet");
}
Byte [] ReceiveData = new Byte[256]; //接收数据
nBytes = 0;
int timeout=0 ;
int timeConsume=0;
while(true)
{
解决方案 »
- (顶者有分)我写了一个VS2010的插件(想要的可以给源代码),怎么安装呢?
- 非静态的字段、方法或属性“ESRI.ArcGIS.Carto.IMapDocument.DocumentFilename.get”要求对象引用
- 如何立即保存app.config
- 急,急,input的value可以为一张图片不??
- 存储过程的参数传递问题?
- 在picturebox中绘图时,如何将坐标系统转换为Y轴向上为正(默认向下为正)?
- 请问大家有没有这样的问题
- 树形菜单,怎么修改选中的子节点的样式啊?
- 使用graphics.DrawString(...)出现"使用了无效参数"错误
- 关于网络编程的几个问题!
- 春节将至,年后要从JAVA转做C-sharp,多分求高手经验,广交天下C-sharp朋友.来者皆有分得,指教者五分打底.
- 用Graphics类中的MeasureString方法去测量一段多行文字的高度的问题
if (nBytes == -1)
{
Console.WriteLine("Host not Responding") ;
break;
}
else if(nBytes>0)
{
timeConsume = System.Environment.TickCount - startTime;
Console.WriteLine("Reply from "+hostPoint.ToString()+" in "
+timeConsume+"MS :Bytes Received"+nBytes);
break;
}
timeConsume=Environment.TickCount - startTime;
if(timeout>1000)
{
Console.WriteLine("Time Out") ;
break;
}
}
//关闭套接字
socket.Close();
}
}
public class IcmpPacket
{
private Byte _type; // 报文类型
private Byte _subCode; // 字代码类型
private UInt16 _checkSum; // 报文校验和
private UInt16 _identifier; // 识别符
private UInt16 _sequenceNumber; // 序列号
private Byte [] _data; //数据包
///***********************************************************
///初始化报文
///***********************************************************
public IcmpPacket(Byte type,Byte subCode,UInt16 checkSum,UInt16 identifier,UInt16 sequenceNumber,int dataSize)
{
_type=type;
_subCode=subCode;
_checkSum=checkSum;
_identifier=identifier;
_sequenceNumber=sequenceNumber;
_data=new Byte[dataSize];
for (int i = 0; i < dataSize; i++)
{
_data[i] = (byte)'#';
}
}
public UInt16 CheckSum
{
get
{
return _checkSum;
}
set
{
_checkSum=value;
}
}
///************************************************************
///将整个ICMP报文信息和数据转化为Byte数据包
///************************************************************
public int ConvertToByte(Byte[] buffer)
{
Byte [] b_type = new Byte[1]{_type};
Byte [] b_code = new Byte[1]{_subCode};
Byte [] b_cksum = BitConverter.GetBytes(_checkSum);
Byte [] b_id = BitConverter.GetBytes(_identifier);
Byte [] b_seq = BitConverter.GetBytes(_sequenceNumber);
int i=0;
Array.Copy( b_type, 0, buffer, i, b_type.Length );
i+= b_type.Length;
Array.Copy( b_code, 0, buffer, i, b_code.Length );
i+= b_code.Length;
Array.Copy( b_cksum, 0, buffer,i, b_cksum.Length );
i += b_cksum.Length;
Array.Copy( b_id, 0, buffer, i, b_id.Length );
i+= b_id.Length;
Array.Copy( b_seq, 0, buffer, i, b_seq.Length );
i += b_seq.Length;
Array.Copy(_data, 0, buffer, i, _data.Length );
i += _data.Length;
return i;
}
public static UInt16 SumOfCheck( UInt16[] buffer )
{
int cksum = 0;
for(int i=0;i<buffer.Length;i++)
cksum += (int) buffer[i];
cksum = (cksum >> 16) + (cksum & 0xffff);
cksum += (cksum >> 16);
return (UInt16)(~cksum);
}
}
}
public class pingcmd
{
private Process myp; public event pingcmd_completed pingcom;//发布事件
private string [] s;
public pingcmd(string [] a) //构造函数
{
//
// TODO: 在此处添加构造函数逻辑
//
this.s=a;
myp=new Process();
myp.StartInfo.UseShellExecute=false;
myp.StartInfo.RedirectStandardError=true;
myp.StartInfo.RedirectStandardInput=true;
myp.StartInfo.RedirectStandardOutput=true;
myp.StartInfo.CreateNoWindow=true;
myp.StartInfo.FileName="cmd.exe";
} public void runping()//线程调用方法
{
ping(this.s);
} public void ping(string ip)//执行ping方法
{
myp.Start();
myp.StandardInput.WriteLine("ping -n 1 "+ip);
myp.StandardInput.WriteLine("exit");
string strRst=myp.StandardOutput.ReadToEnd();
string pingrst="";
myp.Close();
if(strRst.IndexOf("(0% loss)")!=-1)
pingrst = " 连 接 正 常 ";
else if( strRst.IndexOf("Destination host unreachable")!=-1)
pingrst = "无法到达目的主机";
else if(strRst.IndexOf("Request timed out")!=-1)
pingrst = " 连 接 超 时 ";
else if(strRst.IndexOf("Unknown host")!=-1)
pingrst = " 无法解析主机 ";
onpingcomplete(this,new PingEventArgs(new string[,] {{ip,pingrst}}));
} public void ping(string [] ips)
{
foreach(string ip in ips)
ping(ip); } protected virtual void onpingcomplete(object sender,PingEventArgs e)//虚方法
{
pingcom(sender,e);
} }//pingcmd类
////////////////////////
//参数类
/// //////////////
public class PingEventArgs :EventArgs
{
private string [,] pingresult;
public PingEventArgs(string [,] s)
{
this.pingresult=s; } //ping结果
public string [,] ping_result
{
get
{
return this.pingresult;
} } }
}