MFC 实现ping功能。整理来的

// 参数:
//     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;
}

欢迎加入我们的QQ群,无论你是否工作,学生,只要有c / vc / c++ 编程经验,就来吧!158427611

欢迎加入我们的QQ群,无论你是否工作,学生,只要有c / vc / c++ 编程经验,就来吧!158427611 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值