Qt的network模块实现域名找IP

目录

应用开发目的

项目效果图

 全部代码

search.pro

widget.h

widget.cpp

main.cpp

打包exe文件


 

基于Qt Creator应用软件编写的查找IPv4和IPv6的应用层软件

Qt 是一个跨平台的 C++图形用户界面应用程序。分为商业版和免费版(我是这么理解的,没有任何依据)

Qt各个版本的软件下载链接:

https://download.qt.io/archive/qt/icon-default.png?t=N5K3https://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.htmlicon-default.png?t=N5K3https://enigmaprotector.com/en/downloads.html

选择第二个带有Recursive的(使用递归的好处是如果有文件夹,可以自动添加),将exe所在的文件夹的所有内容都选上,然后出现下方弹窗默认OK

 

执行5.2步骤,压缩文件

 

最后执行5.3步骤

 将search_boxed.exe修改或者直接单独拿出来依然可以在Windows上运行,也就是可以单独发给别人啦。

最终效果图:

 查看属性:打包之后文件大小19MB,因为我没有对不相干的文件进行处理,文件有点大,严格按照上图步骤,文件会更小。exe文件在所有支持exe格式的环境下都可以运行。

 总结:简单的原因在于很多函数都已经实现好,我们只需要灵活高效的运用即可,站在巨人的肩膀上,我们才可以看的更远,感谢所有代码贡献者。哈哈

接下来我将继续讲解Qt下的TCP和UDP通信exe,

感兴趣的可以继续看看啦~

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值