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

Ping 程序的 C 語言 Windows 實現 (原始套接字 ICMP)

     編輯:關於C語言

Ping 程序的 C 語言 Windows 實現 (原始套接字 ICMP)

本文展示在 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()

  1. 初始化 Winsock (WSAStartup)。
  2. 解析命令行參數 (ValidateArgs):目標地址、數據大小、是否記錄路由。
  3. 創建原始套接字 (WSASocket(AF_INET, SOCK_RAW, IPPROTO_ICMP...)),**需管理員權限**。
  4. 設置套接字選項:IP_OPTIONS 啟用記錄路由;SO_RCVTIMEO/SO_SNDTIMEO 設置 1 秒超時。
  5. 解析目標地址 (inet_addr/gethostbyname)。
  6. 循環發送 4 次請求 (sendto) 並接收回應 (recvfrom),調用解碼函數顯示結果。
  7. 清理資源 (closesocket, WSACleanup, HeapFree)。

編譯鏈接提示

// 需鏈接 Ws2_32.lib
#pragma comment(lib, "Ws2_32.lib")

完整代碼較長,此處列出骨架與關鍵點。原文鏈接:CSDN 王健南大。

注意事項

  • 原始套接字需要 **Administrator 權限** 運行。
  • Windows 防火牆可能阻攔 ICMP 回應,需放行。
  • 代碼為 IPv4 專用,IPv6 需另行實現 (AF_INET6, IPPROTO_ICMPV6)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved