目录
基于Qt Creator应用软件编写的查找IPv4和IPv6的应用层软件
Qt 是一个跨平台的 C++图形用户界面应用程序。分为商业版和免费版(我是这么理解的,没有任何依据)
Qt各个版本的软件下载链接:
https://download.qt.io/archive/qt/https://download.qt.io/archive/qt/使用Qt的好处有很多,在我这儿就是极大地极高开发效率,最明显的就是大大的加快了开发一款app所需要的时间。
应用开发目的
IP地址用来标识网络中的每一台主机。IP地址就好像我们的具体的家庭地址位置(经纬度。。。),我们所常见的IP地址是IPv4地址,其格式是点分十进制的,比如“192.168.1.1”。
尽管IP地址能够唯一地标记网络上的计算机,但IP地址是一长串数字,不直观,而且用户记忆十分不方便,于是人们又发明了另一套字符型的地址方案,即所谓的域名地址。
IP地址和域名是一一对应的,这份域名地址的信息存放在一个叫域名服务器(Domain name server)的主机内,使用者只需了解易记的域名地址,其对应转换工作就留给了域名服务器。域名服务器就是提供IP地址和域名之间的转换服务的服务器。
那么我们作为开发者怎么能只用域名呢?不想要域名,而是直接使用IP地址,这里我们可以通过自定义一个通过域名查找IP地址的功能实现,因此我做了这么一个简单的不能再简单的应用(我理解的该应用的基本原理:通过输入域名,然后Qt的QHostInfo类的lookupHost成员函数会从网络中的域名服务器查找对应的IP地址并将结果存储到自己的addresses容器中)
项目效果图
widget.ui界面:
举例:输入域名baidu.com,获取结果
全部代码
文件分四个板块
分别是pro工程文件、widget.h头文件和main.cpp主函数和widget.cpp功能文件和界面文件widget.ui
创建项目之后第一步在pro文件中加入network模块
使用UI界面的好处就是我们可以直接创建窗口和按钮,而不必实现窗口和按钮,Qt为我们提供了系列函数,这里的按钮鼠标右键转到槽,选择第一个函数clicked(),就可以实现按钮的函数体编写。然后自定义一个SLOT槽函数来实现对QHostInfo类的lookupHost函数返回的信息进行处理。
search.pro
#-------------------------------------------------
#
# Project created by QtCreator 2023-06-23T16:28:22
#
#-------------------------------------------------
QT += core gui network//这里需要加入network模块
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = search
TEMPLATE = app
# The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
SOURCES += main.cpp\
widget.cpp
HEADERS += widget.h
FORMS += widget.ui
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include "QHostInfo"
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private slots:
void on_IPButton_clicked();
void myHostInfo(const QHostInfo &host);
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include "QDebug"
#include "QMessageBox"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_IPButton_clicked()
{
QString domainName=ui->lineEdit->text();//从文本中获取域名
if(domainName==NULL)
{
QMessageBox::information(this,"Information","please input domain name");
}
QHostInfo::lookupHost(domainName,this,SLOT(myHostInfo(const QHostInfo &)));//通过QHostInfo类的lookupHost函数查找domainName对应的IP地址,
//调用SLOT槽函数,处理操作获得IP地址反馈给lineEdit显示到终端。
}
void Widget::myHostInfo(const QHostInfo &host)//槽函数的实现
{
if(host.error()!=QHostInfo::NoError)
{
qDebug()<<"Lookup failed:"<<host.errorString();
return;
}
foreach (const QHostAddress &address, host.addresses()) {
//输出IPv4、IPv6地址
if(address.protocol()==QAbstractSocket::IPv4Protocol)
{
ui->IPListWidget->addItem("Found IPv4 address"+address.toString());
qDebug()<<"This is an IPv4 address!"<<endl;
}
else if(address.protocol()==QAbstractSocket::IPv6Protocol)
{
ui->IPListWidget->addItem("Found IPv6 address"+address.toString());
qDebug()<<"This is an IPv6 address!"<<endl;
}
else
{
ui->IPListWidget->addItem("IP addresses not found!");
}
}
}
main.cpp
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
打包exe文件
插曲:将项目打包成可执行exe,除此之外也可以将项目打包成apk等格式,这里简单打包成exe格式
步骤:
1.将qt的debug改成release,再重新运行,项目中的构建目录要与实际项目目录一致
2、将release目录下的可执行文件.exe的文件复制一份放入其他目录下3、打开qt的Qt 5.8 for Desktop (MinGW 5.3.0 32 bit)
4、找到放入.exe程序的目录,使用命令windeployqt 可执行文件名字加.exe,这个时候这个.exe就可以直接运行了
5、为了更方便,直接将demo下的所有文件都压缩打包,使用Enigma Virtual Box 软件打包压缩成可执行文件
(https://enigmaprotector.com/en/downloads.html)5.1、使用Enigma Virtual Box ,
先把.exe文件输入到上方的框中
在add中选择增加文件夹(递归方式),5.2、在files options中,选择压缩文件compress files
5.3、选择process,执行封包,最后在demo目录下找到boxed.exe的可执行文件,就可以直接运行了。
1、2、3、4步骤 就可以运行exe可执行文件,(缺点是项目没有打包成一个文件)
继续第五步可以将多个文件打包成一个文件
需要下载一个打包软件,这里选择Enigma Virtual Box
软件下载链接
https://enigmaprotector.com/en/downloads.htmlhttps://enigmaprotector.com/en/downloads.html
选择第二个带有Recursive的(使用递归的好处是如果有文件夹,可以自动添加),将exe所在的文件夹的所有内容都选上,然后出现下方弹窗默认OK
执行5.2步骤,压缩文件
最后执行5.3步骤
将search_boxed.exe修改或者直接单独拿出来依然可以在Windows上运行,也就是可以单独发给别人啦。
最终效果图:
查看属性:打包之后文件大小19MB,因为我没有对不相干的文件进行处理,文件有点大,严格按照上图步骤,文件会更小。exe文件在所有支持exe格式的环境下都可以运行。
总结:简单的原因在于很多函数都已经实现好,我们只需要灵活高效的运用即可,站在巨人的肩膀上,我们才可以看的更远,感谢所有代码贡献者。哈哈
接下来我将继续讲解Qt下的TCP和UDP通信exe,
感兴趣的可以继续看看啦~