Qt5.2中使用ping命令实现Ip扫描功能
在实现类似于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命令详解1和Linux和Windows下ping命令详解2
Qt5.2中使用ping命令实现Ip扫描功能的更多相关文章
- Android代码中使用Ping命令
项目中需要搜索同一WIFI局域网中的设备并进行通信,暂时想到的办法是得到局域网网段的地址,因为同一局域网中的IP地址前三位是相同的,而第四位的范围从0~250,所以对第四位进行遍历搜索,能ping通的 ...
- 批量 ping 测试脚本(IP 扫描)
是否会使用 vpn 工作,已经成为魔法师和麻瓜之间最重要的区分.使用 vpn 工作,也产生了其它一些奇奇怪怪的问题,比如,选择 vpn 服务器. 你要测试哪个 vpn 离你最近. 所以,就有了下面的脚 ...
- 怎么使用ping命令进行连通性测试
关于ping命令的作用: ping 命令有助于验证网络层的连通性!一般进行网络故障排除时,可以使用ping 命令向目标计算机或IP地址发送ICMP回显请求,目标计算机会返回回显应答,如果目标计算机不能 ...
- Linux中的In命令
ln是linux中一个非常重要命令.它的功能是为某一个文件在另外一个位置建立一个同步的链接,这个命令最常用的参数是-s,具体用法是: ln -s 源文件 目标文件 -s 是 symbolic的 ...
- Linux中ping命令
Linux系统的ping命令是常用的网络命令,它通常用来测试与目标主机的连通性,我们经常会说“ping一下某机器,看是不是开着”.不能打开网页时会说“你先ping网关地址192.168.1.1试试”. ...
- TCP/IP协议学习之实例ping命令学习笔记
TCP/IP协议学习之实例ping命令学习笔记(一) 一. 目的为了让网络协议学习更有效果,在真实网络上进行ping命令前相关知识的学习,暂时不管DNS,在内网中,进行2台主机间的ping命令的整个详 ...
- 通过PING命令中的TTL来判断对方操作系统
---恢复内容开始--- 通过PING命令中的TTL来判断对方操作系统简单来说,TTL全程Time to Live,意思就是生存周期.首先要说明ping命令是使用的网络层协议ICMP,所以TTL指的是 ...
- 在windows命令行批量ping局域网内IP
参考了博客园Alfred Zhao的文章<Windows平台ping测试局域网所有在用IP> 在cmd命令行运行如下命令即可: ,,) -w .%i | find "回复&quo ...
- 路由器配置及IP设置及ping命令使用
OSI的七层协议体系结构: 物理层.数据链路层.网络层.运输层.会话层.表示层.应用层 TCP/IP是一个四层的体系结构: 网络接口层.网际层(互联网层)(IP或ARP或ICMP).运输层(TCP或U ...
随机推荐
- MFC坐标问题
页面空间中的矩形被称为窗口,设备空间中的矩形被称为视口. 页面空间与设备空间的转换示意图: 页面空间到设备空间的转换需要两个矩形的宽高比(转换因子). 设备空间到物理空间转换的唯一作用是平移,并由Wi ...
- tomcat开启PID文件
1.配置tomcat启动后将进程号保存至 ./bin/tomcat.pid 文件. 修改 catalina.sh 文件,在 PRGDIR 下面一行添加 CATALINAPID 参数行,如下: PRGD ...
- SQL语句优化方式
不要使用*号进行查询操作,使用具体字段. 索引 在where子句和order by 涉及的字段上合理的添加索引. where 子句优化 避免在where子句中对null值进行判断,应对字段设置默认值 ...
- oracle创建表空间自增空间管理
表空间(tablespace).段(segment).区(extent).块(block),这些都是oracle数据库在数据文件中组织数据的基本单元 1.创建表空间create tablespace ...
- cnblogs添加打赏
上图上真相 1.进入后台设置---文件 2.上传你的支付宝和微信收款码(注意图片格式为bmp格式) 2.还是上图的位置,选择设置选项,找到博客侧边栏公告(支持HTML代码)(支持JS代码) 3.将如下 ...
- 修改Docker中容器的时间和宿主主机时间一致
修改Docker容器的时间和宿主时间一致 在查看容器的日志的,发现时间有和宿主主机时间相差有8个小时,而且宿主主机使用的是CST时间,容器容器使用的是UTC时间 主机时间 DOCKER容器的时间 世界 ...
- windows 安装 jenkins笔记
Jenkins 所有镜像列表: http://mirrors.jenkins-ci.org/status.html 可在镜像网站上下载安装文件,比官方下载快些 jenkins 官网地址: https: ...
- 【串线篇】SpringMVC九大组件
SpringMVC中的Servlet一共有三个层次,分别是HttpServletBean.FrameworkServlet和 DispatcherServlet. HttpServletBean直接继 ...
- atcoder 泛做
https://atcoder.jp/contests/arc060/tasks/arc060_b 先考虑一些特殊情况: $$n>s$$ $$n=s$$ $b$小于$sqrt(N)$可以枚举,如 ...
- python 常用技巧 — 数组 (array)
目录: 1. 数组每一行除以这一行的总数(numpy divide row by row sum) 2. 数组每一行或者每一列求平均 (python average array columns or ...