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

使用 TCP/IP 協議堆疊實作 Ping 功能

     編輯:VC 教學

問題背景

在 Windows 95/NT 環境下,標準 Winsock API 未直接提供 ICMP Ping 功能。Microsoft 直到 Winsock 2.0 仍未內建解決方案,開發者需自行呼叫 ICMP DLL 實作。

解決方案:封裝 ICMP API

本文提供一個 CIcmpEcho 類別(繼承自 CSocket),封裝 ICMP.DLL 核心函數,提供四個公用方法:

  • ResolveIP(CString strIP) — 將 IP 字串轉為網路位序位址
  • ResolveName(CString strHostName) — 透過 DNS/WINS 解析主機名稱
  • GetIP(ULONG ulIP) — 將數值位址轉回點分十進制字串
  • PingHost(ULONG ulIP, int iPingTimeout) — 執行 Ping 並返回往返時間 (ms)

核心實作細節

標頭檔

class CIcmpEcho : public CSocket {
public:
    CIcmpEcho(); virtual ~CIcmpEcho();
    ULONG ResolveIP(CString strIP);
    ULONG ResolveName(CString strHostName);
    DWORD PingHost(ULONG ulIP, int iPingTimeout);
    CString GetIP(ULONG ulIP);
protected:
    // ClassWizard 生成的虛擬函數覆寫
};

實作檔關鍵邏輯

DWORD CIcmpEcho::PingHost(ULONG ulIP, int iPingTimeout) {
    HANDLE hIcmp = IcmpCreateFile();
    char reply[sizeof(ICMP_ECHO_REPLY) + 8];
    PICMP_ECHO_REPLY pReply = (PICMP_ECHO_REPLY)reply;
    pReply->RoundTripTime = 0xFFFFFFFF;

    IcmpSendEcho(hIcmp, ulIP, NULL, 0, NULL, reply, sizeof(reply), iPingTimeout);
    IcmpCloseHandle(hIcmp);
    return pReply->RoundTripTime;
}

其他輔助函數使用 inet_addr、gethostbyname、inet_ntoa 完成位址轉換與解析。

使用說明

  1. 專案需加入 ICMPAPI.H、ICMPAPI.CPP、ICMP.LIB、IPEXPORT.H、IPEXPORT.CPP(可從 MSDN 取得)。
  2. 實例化 CIcmpEcho,呼叫 ResolveName 或 ResolveIP 取得位址,再呼叫 PingHost 執行偵測。
  3. 返回值為毫秒數;0xFFFFFFFF 表示逾時或失敗。

適用範圍與限制

  • 支援 Windows 95、NT 3.51、NT 4.0 及更新版本。
  • 需以管理員權限執行(原始 Socket 權限)。
  • 僅支援 IPv4;IPv6 需使用 Icmp6SendEcho2 等新 API。

結語

封裝 ICMP DLL 為 MFC 應用程式提供了輕量級 Ping 能力,避免依賴外部 ping.exe 解析輸出,適合內建網路診斷功能的桌面應用。

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