程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 利用Visual C#實現ICMP網絡協議(8)

利用Visual C#實現ICMP網絡協議(8)

編輯:關於C語言

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. 至此,在上述步驟都正確完成,並全部保存後,【Visual C#實現Ping命令】項目的全部工作就完成了。此時單擊【F5】快捷鍵運行程序。在程序的【請輸入主機名】文本框中輸入遠程主機名,這裡輸入的是互聯網主機"WWW.163.com",單擊【Ping】按鈕,則程序把Ping操作後的信息顯示出來。具體如圖07所示:

圖06:【Visual C#實現Ping命令】的運行界面

七.總結:

在運行上述程序時,如果網絡狀況良好,則ICMP報文發送和返回時間差就很短,"in"後面帶的時間就小,這也就是所謂的"離"的"近";如果網絡狀況不好,則ICMP報文發送和返回的時間差就長,"in"後面帶的時間就大,甚至可能出現timeout,即超時。這表明"離"的"遠"。當然如果對方沒有開機,也會出現超時情況,所以實際操作要具體情況,具體對待。

細心的讀者可能多次運行此程序的時候,就會發現,第一次發送時所耗時間往往比本程序緊接著的幾次大得多。這是程序數據緩存造成的。這也就是說ping命令的第一次數據是不准確的。這種情況不僅在本文中Ping命令中存在,對於Windows系統的Ping也存同樣的問題。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved