- UID
- 1029342
- 性别
- 男
|
12. 在Form1.cs文件中的Main函数之后,添加下列代码,下列代码是在Form1.cs中定义IcmpPacket类,程序是通过此类来构造ICMP报文:
{
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报文
public int CountByte ( 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 ;
}
//将整个ICMP报文信息和数据转化为Byte数据包
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 ) ;
}
} |
13. 至此,在上述步骤都正确完成,并全部保存后,【VisualC#实现Ping命令】项目的全部工作就完成了。此时单击【F5】快捷键运行程序。在程序的【请输入主机名】文本框中输入远程主机名,这里输入的是互联网主机"WWW.163.com",单击【Ping】按钮,则程序把Ping操作后的信息显示出来。具体如图07所示:
图06:【Visual C#实现Ping命令】的运行界面
|
七.总结:
在运行上述程序时,如果网络状况良好,则ICMP报文发送和返回时间差就很短,"in"后面带的时间就小,这也就是所谓的"离"的"近";如果网络状况不好,则ICMP报文发送和返回的时间差就长,"in"后面带的时间就大,甚至可能出现timeout,即超时。这表明"离"的"远"。当然如果对方没有开机,也会出现超时情况,所以实际操作要具体情况,具体对待。
细心的读者可能多次运行此程序的时候,就会发现,第一次发送时所耗时间往往比本程序紧接着的几次大得多。这是程序数据缓存造成的。这也就是说ping命令的第一次数据是不准确的。这种情况不仅在本文中Ping命令中存在,对于Windows系统的Ping也存同样的问题。 |
|