在实现类似于Free IP Scanner 2.1的Ip扫描器软件中,会用到ping命令。如果使用Qt编程实现,主要会用QThread、QProcess这两个类。关于这两个类的具体用法可以查阅Qt助手或者QT官网

在QT中为了扫描大量的Ip,通常需要将扫描Ip的任务放在一个单独的线程来完成,这样需要子类化QThread,重写其run()方法。从QThread类派生出一个ShellProcess的子类,该类的头文件代码如下:

#ifndef SHELLPROCESS_H
#define SHELLPROCESS_H #include <QThread>
#include <QtCore/QStringList> // Ping IP的线程子类
class ShellProcess : public QThread
{
Q_OBJECT
public:
explicit ShellProcess(QObject *parent = 0); QStringList getIpRangle(); //获取需要扫描的IP列表
void setIpRange(QStringList ipRange); //设置需要扫描的IP列表 protected:
void run(); signals:
void commandSuccessed(QString ip);
void commandFailed(QString ip); public slots: private:
QStringList ipRange; //需要扫描的IP列表
}; #endif // SHELLPROCESS_H

ShellProcess类的实现代码如下:

#include "shellprocess.h"
#include <QtCore/QtDebug>
#include <QtCore/QProcess> ShellProcess::ShellProcess(QObject *parent) :
QThread(parent)
{
} QStringList ShellProcess::getIpRangle()
{
return this->ipRange;
} void ShellProcess::setIpRange(QStringList ipRange)
{
this->ipRange = ipRange;
} void ShellProcess::run()
{
QString ip;
//依次扫描Ip列表中的各个IP
foreach( ip, ipRange )
{
int exitCode;
//对每个Ip执行ping命令检测其是否在线
qDebug() << "ping " + ip << endl;
#ifdef Q_OS_WIN
QString strArg = "ping " + ip + " -n 1 -i 2";
exitCode = QProcess::execute(strArg);
#else
//其他平台(Linux或Mac)
exitCode = QProcess::execute("ping", QStringList() << "-c 1" << "-t 2" << ip));
#endif if(0 == exitCode)
{
//it's alive
qDebug() << "shell ping " + ip + " sucessed!";
//发射该IP在线的信号
emit commandSuccessed(ip);
} else {
qDebug() << "shell ping " + ip + " failed!";
//发射IP离线的信号
emit commandFailed(ip);
}
}
}

在实际编程中可以这样使用ShellProcess类:

#define THREAD_SIZE 10	//线程数

ShellProcess *shellProcess;
for(int i=0;i<THREAD_SIZE;i++){
shellProcess= new ShellProcess(this);
connect(shellProcess, SIGNAL(commandSuccessed(QString)), this, SLOT(slot_onCommandSuccessed(QString)));
connect(shellProcess, SIGNAL(commandFailed(QString)), this, SLOT(slot_onCommandFailed(QString)));
connect(shellProcess, SIGNAL(finished()), shellProcess, SLOT(deleteLater()));
//设置每个线程的Ip扫描范围,一共10个线程
shellProcess->setIpRange(ip_in_thread[i]);
//启动线程
shellProcess->start();
}

具体的项目代码可以参看我github上使用Qt5.2的一个Ip扫描器:ip_scan,目前只完成了一部分功能。

另外,需要注意的是ping命令在Windows下和Linux(Mac)下的命令有所不同,可以参考Linux和Windows下ping命令详解1Linux和Windows下ping命令详解2



Qt5.2中使用ping命令实现Ip扫描功能的更多相关文章

  1. Android代码中使用Ping命令

    项目中需要搜索同一WIFI局域网中的设备并进行通信,暂时想到的办法是得到局域网网段的地址,因为同一局域网中的IP地址前三位是相同的,而第四位的范围从0~250,所以对第四位进行遍历搜索,能ping通的 ...

  2. 批量 ping 测试脚本(IP 扫描)

    是否会使用 vpn 工作,已经成为魔法师和麻瓜之间最重要的区分.使用 vpn 工作,也产生了其它一些奇奇怪怪的问题,比如,选择 vpn 服务器. 你要测试哪个 vpn 离你最近. 所以,就有了下面的脚 ...

  3. 怎么使用ping命令进行连通性测试

    关于ping命令的作用: ping 命令有助于验证网络层的连通性!一般进行网络故障排除时,可以使用ping 命令向目标计算机或IP地址发送ICMP回显请求,目标计算机会返回回显应答,如果目标计算机不能 ...

  4. Linux中的In命令

    ln是linux中一个非常重要命令.它的功能是为某一个文件在另外一个位置建立一个同步的链接,这个命令最常用的参数是-s,具体用法是: ln -s  源文件 目标文件    -s 是 symbolic的 ...

  5. Linux中ping命令

    Linux系统的ping命令是常用的网络命令,它通常用来测试与目标主机的连通性,我们经常会说“ping一下某机器,看是不是开着”.不能打开网页时会说“你先ping网关地址192.168.1.1试试”. ...

  6. TCP/IP协议学习之实例ping命令学习笔记

    TCP/IP协议学习之实例ping命令学习笔记(一) 一. 目的为了让网络协议学习更有效果,在真实网络上进行ping命令前相关知识的学习,暂时不管DNS,在内网中,进行2台主机间的ping命令的整个详 ...

  7. 通过PING命令中的TTL来判断对方操作系统

    ---恢复内容开始--- 通过PING命令中的TTL来判断对方操作系统简单来说,TTL全程Time to Live,意思就是生存周期.首先要说明ping命令是使用的网络层协议ICMP,所以TTL指的是 ...

  8. 在windows命令行批量ping局域网内IP

    参考了博客园Alfred Zhao的文章<Windows平台ping测试局域网所有在用IP> 在cmd命令行运行如下命令即可: ,,) -w .%i | find "回复&quo ...

  9. 路由器配置及IP设置及ping命令使用

    OSI的七层协议体系结构: 物理层.数据链路层.网络层.运输层.会话层.表示层.应用层 TCP/IP是一个四层的体系结构: 网络接口层.网际层(互联网层)(IP或ARP或ICMP).运输层(TCP或U ...

随机推荐

  1. 正则finditer的使用

    import re #\. 是刚需必须有 d+ 必须一个或多个数字 pattern = re.compile(r'\d+\.\d*') d = pattern.finditer('3.14159265 ...

  2. fiddler 解决不能抓https包的问题

    新解决方案 重置Fiddler,具体步骤: Tools > Fiddler Options > HTTPS > “Certificates generated by MakeCert ...

  3. VS 2017产品秘钥

    Enterprise: NJVYC-BMHX2-G77MM-4XJMR-6Q8QF Professional: KBJFW-NXHK6-W4WJM-CRMQB-G3CDH

  4. Vue 创建组件的两种方法

    地址:https://blog.csdn.net/cofecode/article/details/74634301 创建组件的两种方法 1.全局注册 2.局部注册 var child=Vue.ext ...

  5. JavaScript 盖尔-沙普利算法

    最近在学 JavaScript , 为了尽快熟悉语法,决定移植以前写的盖尔-沙普利算法. c# 下的代码:https://www.cnblogs.com/aitong/p/10973774.html ...

  6. 自编shell脚本合集(完善中)

    1.数据库备份 #!/bin/bash user="root" psword="root" bakdir="/data/mysqlbak" ...

  7. how to use gflags

    参考https://blog.csdn.net/jcjc918/article/details/50876613 安装: git clone https://github.com/gflags/gfl ...

  8. ArrayListMultimap

    遇到这样一个场景,就是要判断传过来的Lists里有几组相邻的元素,然后有多少个单一的元素,比如3,3,3,4,4,4,5,5,5,6,6,6,8,9,10,11 方法有很多,但是我选了ArrayLis ...

  9. nginx 反向代理服务

    目录 Nginx代理服务基本概述 Nginx代理服务常见模式 Nginx代理服务支持协议 Nginx反向代理配置语法 Nginx反向代理场景实践 配置代理实战 在lb01上安装nginx Nginx代 ...

  10. spring Data solr依赖文件 和xml配置文件

    <dependencies>        <dependency>            <groupId>org.springframework.data< ...