上代码:
/*
作者:侯文斌
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);
}