首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

用 Visual C# 實作 ICMP 協議與 Ping 功能(完結篇):IcmpPacket 類別與執行驗證

     編輯:關於C語言

IcmpPacket 類別:封裝 ICMP 封包結構

在 Form1.cs 的 Main() 之後定義 IcmpPacket 類別,負責建構 ICMP 回顯請求/回應封包。核心欄位對應 RFC 792 定義:

  • _type (Byte) - 類型 (8 = Echo Request)
  • _subCode (Byte) - 代碼 (通常為 0)
  • _checkSum (UInt16) - 檢驗和
  • _identifier (UInt16) - 識別碼,用於配對請求/回應
  • _sequenceNumber (UInt16) - 序號
  • _data (Byte[]) - 選擇性資料載荷

關鍵方法解析

  1. 建構函式:依傳入參數初始化欄位,資料區填入指定大小的字元 (預設 '#')。
  2. CountByte(Byte[] buffer):將所有欄位序列化為位元組陣列,按順序寫入 Type、Code、Checksum、Identifier、Sequence、Data,回傳總長度。
  3. SumOfCheck(UInt16[] buffer) 靜態方法:依 RFC 1071 計算 Internet 檢驗和 — 將所有 16-bit 字相加,溢位回卷,最後取一補數。

完整執行流程與畫面

按 F5 執行,輸入主機名 (如 www.163.com) 點擊「Ping」,程式連續發送 3 次 ICMP Echo Request 並顯示往返時間:

Ping 執行結果畫面

圖 06:Visual C# 實作 Ping 命令 - 執行介面

總結與觀察重點

  • 網路品質指標:回應時間 (ms) 越短代表延遲越低;出現 timeout 可能為主機離線、防火牆封鎖 ICMP 或網路擁塞。
  • 首次測量偏差:首次 Ping 耗時通常明顯較高,主因是 ARP 解析、路由表查找、DNS 快取等冷啟動開銷。Windows 內建 ping.exe 同樣存在此現象。
  • 防火牆影響:現代網路環境常封鎖 ICMP,Ping 不通 ≠ 服務不可用,需搭配 TCP 連接測試 (如 Telnet/HTTP) 綜合判斷。

本系列完整展示了從 Raw Socket 建立、ICMP 封包手工組裝、檢驗和計算、非同步收發到結果解析的全流程,是深入理解網路底層協議的優秀實作練習。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved