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

VC++ 6.0 打造網路自動測試工具:ICMP 原始 Socket 實現 Ping 與語音告警

     編輯:VC 教學

從手動 Ping 到自動化

早期方案呼叫 PING.EXE 需人工點擊、觀察 DOS 視窗。改用 Winsock 原始 Socket + ICMP 協定,可在程式內部直接發送/接收 Echo Request/Reply,配合定時器實現全自動輪詢。

專案準備

  1. AppWizard 建立專案 Netest,步驟 4 勾選「Windows Sockets」
  2. 加入 AUTOP.CPP 實作核心邏輯
  3. 調整原 ReadInfo 中的 GlobalFree 移至 OnDestroy,防止記憶體過早釋放影響 Winsock

自動測試菜單與定時器

void CNetestView::OnAutotest() {
    SetTimer(1, 30000, NULL); // 30 秒一次
    m_TickCount = 20;         // 20 次 = 10 分鐘
    // 禁用「自動測試」選單,啟用「停止自動」
    CMenu* pMenu = AfxGetMainWnd()->GetMenu();
    pMenu->EnableMenuItem(ID_AUTOTEST, MF_DISABLED|MF_GRAYED);
    pMenu->EnableMenuItem(ID_STOPAUTO, MF_ENABLED);
    SendMessage(WM_TIMER, 0, 0L); // 立即執行第一輪
}

void CNetestView::OnTimer(UINT nIDEvent) {
    if(++m_TickCount < 20) return; // 未滿 10 分鐘
    KillTimer(1); m_TickCount = 0;

    BOOL allOk = TRUE;
    InvalidateRect(NULL); // 刷新畫面

    for(int i=0; i

核心 ICMP Ping 實作 (AUTOP.CPP)

BOOL Autotest(LPCSTR szDestHost, int retry) {
    WSADATA wsa; WSAStartup(MAKEWORD(2,1), &wsa);
    SOCKET sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
    // 設定接收逾時 1 秒
    int timeout = 1000;
    setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(timeout));

    sockaddr_in dest = { AF_INET, 0, inet_addr(szDestHost) };
    ICMP_HEADER icmp = { 8, 0, 0, (u_short)GetCurrentProcessId(), 0 }; // Type=8 Echo Request

    for(int k=0; k

語音檔製作提示

使用 Windows 錄音機錄製「節點 1 異常」、「節點 2 異常」…存為 err1.wav, err2.wav…順序對應 INFO.INI 節點順序。

結語

此工具已實戰部署於機房監控,穩定運行多年。核心優勢:無外部相依、純使用者模式、可攜性強(同代碼易移植至嵌入式 Windows CE)。

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