打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
MFC 实现ping功能。整理来的
MFC 实现ping功能。整理来的
2012-03-13      0 个评论      
收藏    
我要投稿
[cpp]
<pre name="code" class="cpp"> 
// 参数: 
//     szTarget目标地址(可以是域名、IP地址) 
//     dwTime返回时间;如果是超时,等于INFINITE 
BOOL Ping(LPCTSTR szTarget, DWORD &dwTime) 

    BOOL bSuccess = FALSE; 
    dwTime = INFINITE; 
 
    if(szTarget == NULL) 
    { 
        TRACE0("Target Is NULL\n"); 
        return FALSE; 
    } 
 
    TCHAR szCmdLine[80]; 
    if(_sntprintf(szCmdLine, sizeof(szCmdLine) / sizeof(TCHAR), 
        _T("ping.exe -n 1 %s"), szTarget) == sizeof(szCmdLine) / sizeof(TCHAR)) 
    { 
        TRACE0("Target Is Too Long\n"); 
        return FALSE; 
    } 
 
    HANDLE hWritePipe = NULL; 
    HANDLE hReadPipe = NULL; 
    HANDLE hWriteShell = NULL; 
    HANDLE hReadShell = NULL; 
 
    SECURITY_ATTRIBUTES  sa; 
    memset(&sa, 0, sizeof(sa)); 
    sa.nLength = sizeof(sa); 
    sa.bInheritHandle = TRUE; 
    sa.lpSecurityDescriptor = NULL; 
 
    if(CreatePipe(&hReadPipe, &hReadShell, &sa, 0) 
        && CreatePipe(&hWriteShell, &hWritePipe, &sa, 0)) 
    { 
        STARTUPINFO            si; 
        memset(&si, 0, sizeof(si)); 
        si.cb           = sizeof(si); 
        si.dwFlags      = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES; 
        si.hStdInput    = hWriteShell; 
        si.hStdOutput   = hReadShell; 
        si.hStdError    = hReadShell; 
        si.wShowWindow  = SW_HIDE; 
         
        PROCESS_INFORMATION    pi; 
        memset(&pi, 0, sizeof(pi)); 
         
        int nMin = -1, nMax = -1, nAvg = -1; 
        if(CreateProcess(NULL, szCmdLine, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi)) 
        { 
            if(WaitForSingleObject(pi.hProcess, 10000) == WAIT_OBJECT_0) 
            { 
                TCHAR szBuffer[1024]; 
                DWORD dwBytes; 
                if(ReadFile(hReadPipe, szBuffer, sizeof(szBuffer), &dwBytes, NULL)) 
                { 
                    szBuffer[dwBytes] = '\0'; 
 
                    LPTSTR lpszTime = NULL; 
                    lpszTime = _tcsstr(szBuffer, _T("Request timed out")); 
                    if(lpszTime == NULL) 
                    { 
                        lpszTime = _tcsstr(szBuffer, _T("Minimum")); 
                        if(lpszTime != NULL) 
                        { 
                            if(_stscanf(lpszTime, _T("Minimum = %dms, Maximum = %dms, Average = %dms"), 
                                &nMin, &nMax, &nAvg) == 3) 
                            { 
                                TRACE3("%d, %d, %d\n", nMin, nMax, nAvg); 
 
                                dwTime = nAvg; 
                                bSuccess = TRUE; 
                            } 
                        } 
                        else 
                        { 
                            TRACE0("PING FORMAT is Error\n"); 
                        } 
                    } 
                    else 
                    { 
                        TRACE0("PING is Time Out\n"); 
 
                        bSuccess = TRUE; 
                    } 
                     
                } 
            } 
            else 
            { 
                TRACE1("Process(%d) is Time Out\n", pi.dwProcessId); 
                TerminateProcess(pi.hProcess, 0); 
            } 
 
            CloseHandle(pi.hThread); 
            CloseHandle(pi.hProcess); 
 
            TRACE3(_T("Minimum = %dms, Maximum = %dms, Average = %dms\n"), nMin, nMax, nAvg); 
        } 
    } 
 
    if(hWritePipe != NULL) 
        CloseHandle(hWritePipe); 
    if(hReadPipe != NULL) 
        CloseHandle(hReadPipe); 
    if(hWriteShell != NULL) 
        CloseHandle(hWriteShell); 
    if(hReadShell != NULL) 
        CloseHandle(hReadShell); 
 
    return bSuccess; 
}  

摘自  牧心_hp 学习人生
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
VC获取MAC地址的4种方法
Windows下实现进程保护
exe、msi、dos、bat等静默运行,后台运行,不弹窗的解决办法
服务程序需要当前用户权限的方法(?)
双进程保护
非同凡响,C 调用PHP - C|C - 编程开发 - 伊甸网
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服