本文展示在 Windows 平台使用 Winsock2 原始套接字 (SOCK_RAW, IPPROTO_ICMP) 實現 Ping 功能的完整代碼。代碼包含 ICMP 封裝、校驗和計算、IP 選項解析(記錄路由)、超時處理、序號管理等核心邏輯。
// IP 頭部 (20 字節基本 + 選項)
typedef struct _iphdr {
unsigned char h_len:4, version:4;
unsigned char tos;
unsigned short total_len;
unsigned short ident;
unsigned short frag_and_flags;
unsigned char ttl;
unsigned char proto;
unsigned short checksum;
unsigned long sourceIP, destIP;
} IpHeader;
// ICMP 回顯請求/回應頭部
typedef struct _icmphdr {
unsigned char i_type; // 8=Echo Request, 0=Echo Reply
unsigned char i_code;
unsigned short i_cksum;
unsigned short i_id; // 進程 ID 標識
unsigned short i_seq; // 序號
unsigned long timestamp; // 發送時間戳
} IcmpHeader;
// IP 記錄路由選項頭部
typedef struct _ipoptionhdr {
unsigned char code; // 0x07 = Record Route
unsigned char len; // 選項總長度
unsigned char ptr; // 當前指針
unsigned long addr[9]; // 最多記錄 9 個路由器地址
} IpOptionHeader;
FillICMPData():填充 ICMP 請求包,設置類型/代碼/ID/序號/時間戳,數據部分填充模式字節。checksum():標準 Internet 校驗和算法,16 位字求和後取反。DecodeIPOptions():解析 IP 記錄路由選項,打印經過路由器 IP 及主機名。DecodeICMPHeader():驗證回應包 ID/類型/序號,計算往返時間 (RTT) 並打印。main()WSAStartup)。ValidateArgs):目標地址、數據大小、是否記錄路由。WSASocket(AF_INET, SOCK_RAW, IPPROTO_ICMP...)),**需管理員權限**。IP_OPTIONS 啟用記錄路由;SO_RCVTIMEO/SO_SNDTIMEO 設置 1 秒超時。inet_addr/gethostbyname)。sendto) 並接收回應 (recvfrom),調用解碼函數顯示結果。closesocket, WSACleanup, HeapFree)。// 需鏈接 Ws2_32.lib
#pragma comment(lib, "Ws2_32.lib")
完整代碼較長,此處列出骨架與關鍵點。原文鏈接:CSDN 王健南大。
AF_INET6, IPPROTO_ICMPV6)。