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

ICMP 協定深度解析 (四):Raw Socket 實作 Ping 與 Traceroute 基礎

     編輯:VC 教學

Raw Socket 實作 Ping 雖較繁複,但屬標準介面,微軟長期支援,可移植。本文程式碼改編自 tangentsoft.net,大量註解並補充實作建議。需 Win2K/XP/NT + 管理員權限。

核心資料結構

struct IPHeader { BYTE h_len:4, version:4; BYTE tos; USHORT total_len, ident, flags; BYTE ttl, proto; USHORT checksum; ULONG source_ip, dest_ip; };
struct ICMPHeader { BYTE type, code; USHORT checksum, id, seq; ULONG timestamp; };

關鍵函數

  • ip_checksum:計算 IP/ICMP 標頭檢查和。
  • setup_for_ping:建立 SOCK_RAW/IPPROTO_ICMP Socket,setsockopt 設定 TTL,解析目標位址。
  • init_ping_packet:填充 ICMP Header (Type=8, Code=0)、ID/Sequence、Timestamp。
  • send_ping:sendto 發送封包。
  • recv_ping:recvfrom 接收,驗證 Sequence Number 過濾雜訊。
  • decode_reply:解析 IP 標頭長度、定位 ICMP 標頭、判斷 Type (0=Echo Reply, 3=Unreachable, 11=Time Exceeded) 並顯示 RTT/TTL。

Traceroute 擴充提示

修改 IP Header 的 TTL 值 (從 1 遞增),發送 ICMP Echo Request。中繼路由器收到 TTL=0 會回傳 Type 11 (Time Exceeded),即可取得該躍點 IP。若收到 Type 0 表示已達目的地。本程式碼架構易於擴充為完整 Traceroute。

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