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