QProcess调用外部ping程序实现网络状态检测

上代码:

/*
    作者:侯文斌
    E-mail:houwenbin1986@gmail.com
    注:请尊重原作者劳动成果,仅供学习使用,请勿盗用,违者必究!
*/
#ifndef SHELLPROCESS_H
#define SHELLPROCESS_H

#include <QStringList>
#include <QThread>
#include <QProcess>

//命令行工具类
class ShellProcess : public QThread
{
    Q_OBJECT
public:
    explicit ShellProcess(QObject *parent = 0);
    QStringList getIpRange();
public:
    static bool isAlive(QString ip, int port, int timeout = 1000);
signals:
    void commandSuccess(QString ip);
    void commandFailed(QString ip);
public slots:
    void setIpRange(QStringList ipRange);
    void readResult();
    void startedThread();
protected:
    void run();
private:
    void bindEvent();
private:
    QStringList ipRange;
    QProcess* m_process;
};

#endif // SHELLPROCESS_H


/*
    作者:侯文斌
    E-mail:houwenbin1986@gmail.com
    注:请尊重原作者劳动成果,仅供学习使用,请勿盗用,违者必究!
*/
#include "shellprocess.h"
#include <QtCore>
#include <QTcpSocket>
#include <QUdpSocket>

#define USE_PARSE_RESULT //使用解析返回内容方式

ShellProcess::ShellProcess(QObject *parent)
    : QThread(parent)
{
    m_process = new QProcess(this);
    this->bindEvent();
}

void ShellProcess::bindEvent()
{
    connect( this, SIGNAL(started()), this, SLOT(startedThread()) );
    connect( m_process, SIGNAL(readyReadStandardOutput()), this, SLOT(readResult()) );
}

QStringList ShellProcess::getIpRange()
{
    return this->ipRange;
}

void ShellProcess::setIpRange(QStringList ipRange)
{
    this->ipRange = ipRange;
}

void ShellProcess::startedThread()
{
#ifndef USE_PARSE_RESULT
    return ;
#endif

    QString ip;
    foreach( ip, ipRange )
    {
#ifdef Q_OS_WIN
        QString strArg = "ping -n 1 -i 2 "+ ip;
        m_process->start(strArg);//异步,才可以看到输出
        //m_process->execute(strArg);//同步,直接打印了
#else
        QStringList argstrList;
        argstrList << "-c 1" << "-t 2" << ip;
        m_process->start("ping", argstrList);//异步,才可以看到输出
        //m_process->execute("ping", argstrList);//同步,直接打印了
#endif
    }

}

void ShellProcess::run()
{
#ifdef USE_PARSE_RESULT
    return ;//结束线程
#endif

    QString ip;
    foreach( ip, ipRange )
    {
        qDebug() << "ping " + ip;
        //qDebug()<<"判断"<<ip<<"mysql在线与否:"<<isAlive(ip, 3306, 100);
        int exitCode = 0;
#ifdef Q_OS_WIN
        //启动一个ping进程,然后等待该进程结束。
        QString strArg = "ping " + ip + " -n 1 -i 2";
        exitCode = QProcess::execute(strArg);
#else
        exitCode = QProcess::execute("ping", QStringList() << "-c 1" << "-t 2" << ip);
#endif
        if ( 0 == exitCode ) {
            // it's alive
            qDebug() << "shell ping " + ip + " success";
            emit commandSuccess(ip);
        } else {
            qDebug() << "shell ping " + ip + " failed";
            emit commandFailed(ip);
        }
    }

}

//解析Console打印内容
void ShellProcess::readResult()
{
    QProcess *ping = qobject_cast<QProcess *>(sender());
    if ( !ping )
        return;
    QTextCodec *codec = QTextCodec::codecForName("GBK");//指定QString的编码方式
    QString res = codec->toUnicode( ping->readAllStandardOutput() );    
    QString ip = ping->arguments().last();
#ifdef Q_OS_WIN
    if ( !res.contains('%') )
        return;
    const int percent = res.mid(res.indexOf('('), res.indexOf(')')).section('%', 0, 0).remove('(').toInt();
    qDebug()<<res<<percent;
    if ( percent == 100 ) {
        qDebug() << ip << "host not found.";
        emit commandFailed(ip);
    } else {
        qDebug() << ip << "host found.";
        emit commandSuccess(ip);
    }
#else
    qDebug()<<res;
#endif
}

//判断IP地址及端口是否在线
bool ShellProcess::isAlive(QString ip, int port, int timeout)
{
    QTcpSocket tcpClient;
    tcpClient.abort();
    tcpClient.connectToHost(ip, port);
    //100毫秒没有连接上则判断不在线
    return tcpClient.waitForConnected(timeout);
}

Qt中,你可以使用`QProcess`类来执行外部可执行程序并将其集成到对话框(Dialog)中。下面是一个简单的示例代码片段,展示了如何创建一个对话框并在其中启动一个外部程序: ```cpp #include <QApplication> #include <QDialog> #include <QPushButton> #include <QProcess> class MyDialog : public QDialog { public: explicit MyDialog(QWidget *parent = nullptr) : QDialog(parent) { // 创建一个按钮,点击后会执行外部程序 QPushButton *executeButton = new QPushButton("执行", this); connect(executeButton, &QPushButton::clicked, this, &MyDialog::onExecute); QVBoxLayout *layout = new QVBoxLayout(); layout->addWidget(executeButton); setLayout(layout); } private slots: void onExecute() { // 使用QProcess开始一个新的进程,这里假设你想执行的是一个命令行工具"example_app.exe" QProcess process; QString executablePath = "path_to_your_example_app.exe"; // 替换为你实际的路径 process.start(executablePath); // 等待外部程序结束,可以设置timeout来处理超时情况 if (process.waitForFinished(-1)) { qDebug() << "外部程序执行完毕"; } else { qWarning() << "外部程序执行失败"; } } }; int main(int argc, char *argv[]) { QApplication app(argc, argv); // 创建并显示对话框 MyDialog dialog; dialog.show(); return app.exec(); } ``` 在这个例子中,当你点击对话框里的"执行"按钮,`onExecute`槽函数会被调用,然后`QProcess`会启动指定的外部应用程序。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值