早期方案呼叫 PING.EXE 需人工點擊、觀察 DOS 視窗。改用 Winsock 原始 Socket + ICMP 協定,可在程式內部直接發送/接收 Echo Request/Reply,配合定時器實現全自動輪詢。
Netest,步驟 4 勾選「Windows Sockets」AUTOP.CPP 實作核心邏輯ReadInfo 中的 GlobalFree 移至 OnDestroy,防止記憶體過早釋放影響 Winsockvoid 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
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)。