C/C++ 通过管道的方式调用Windows ping命令 且 不显示黑窗口(cmd 窗口)

目录

简介

通常我们使用Windows的Ping命令,会把Ping的详细结果显示到cmd窗中,所以不能直接隐藏cmd窗口。解决思路:我们可以把ping的结果直接写到管道中,然后直接拷贝到定义的char数组中。通过解析收到的数据,就可以知道是否Ping成功了。这样的方式可以屏蔽cmd窗口。

代码详解

#include <stdlib.h>
#include <iostream>
#include <Windows.h>
#include <tchar.h>

using namespace std;

bool pingOnlyOnce(const string IP)
{
    bool bRet = false;

    // chcp 437 这个命令把操作系统默认语言强制转换成英文显示,便于解析。
    const string PING_CMD = "chcp 437 && ping -n 1 ";
    string PING_CMD_IP(PING_CMD);
    PING_CMD_IP.append(IP);

    char pingResult[512] = { 0 };

    // 通过管道调用Ping命令
    FILE *pPipe;
    if ( NULL == (pPipe = _popen(PING_CMD_IP.c_str(), "rt")) )
    {
        exit(1);
    } 

    bRet = false;

    // 解析ping结果
    while(fgets(pingResult, 512, pPipe))
    {
        // Ping 失败通常有两种情况:一种是timeout;
        //一种是,路由器返回"Destination host unreachable",此时ping命令还没有timeout。所以在ping结果中,两种情况存在任意一种,都是ping失败了。
        if ( strstr(pingResult, "Request timed out") != NULL 
        || strstr(pingResult, "Destination host unreachable") != NULL)
        {
            bRet = false;
            break;
        }
        // 在Ping一次的情况下,Ping成功一定会有"Lost =0"字符串出现。
        else if ( strstr(pingResult, "Lost =0") != NULL )
        {
            bRet = true;
            break;
        }
        // 打印 行 ping结果
        printf("%s", pingResult);
    }

    _pclose(pPipe);
    return bRet;
}

int main()
{
    bool bPingSuccess = false;

    bPingSuccess = pingOnlyOnce("127.0.0.1");
    if ( bPingSuccess )
    {
        cout << "PING SUCCESS !" << endl;
    }
    else
    {
        cout << "PING FAILED !" << endl;
    }

    system("pause");
    return 0;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71

后记

运行上述代码,也会显示黑窗口,但是这个黑窗口是Application本身的黑窗口,不是cmd的窗口,把上述函数集成到你的代码中就不会有黑窗口了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值