C++ Qt开发之使用QHostInfo查询主机地址

 更新时间:2024年03月10日 11:07:26   作者:lyshark  
Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,本文将重点介绍如何运用QHostInfo组件实现对主机地址查询功能,希望对大家有所帮助

Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用QHostInfo组件实现对主机地址查询功能。

在Qt网络编程中,QHostInfo是一个强大而灵活的组件,用于获取有关主机的信息,包括主机名、IP地址和域名解析等。通过支持异步查询的机制,它能够在后台获取主机信息,避免阻塞主线程,同时通过信号-槽机制提供查询结果。其多主机查询、可靠的错误处理和与网络环境的适应性,使其成为处理网络应用中主机信息获取的理想选择。

以下是QHostInfo类的一些常用函数的解释:

函数描述
QHostInfo()默认构造函数,创建一个空的QHostInfo对象。
QHostInfo(const QHostInfo &other)拷贝构造函数,根据给定的other对象创建一个新的对象。
QHostInfo &operator=(const QHostInfo &other)赋值运算符,将other对象的值赋给当前对象。
QHostInfo &swap(QHostInfo &other)交换两个QHostInfo对象的值。
bool isNull() const判断QHostInfo对象是否为空,即未进行任何查询。
bool isComplete() const判断查询是否完成,返回true表示查询已完成,false表示正在进行中。
QList<QHostAddress> addresses() const返回与主机相关联的IP地址列表。
QString hostName() const返回主机的名称。
QStringList aliases() const返回主机的别名列表。
QHostInfo::Error error() const返回查询时发生的错误。
QString errorString() const返回与错误代码对应的人类可读的错误字符串。
static QHostInfo fromName(const QString &name)根据主机名创建QHostInfo对象。
static QHostInfo fromAddress(const QHostAddress &address)根据IP地址创建QHostInfo对象。
static QHostInfo localHostName()返回本地主机的QHostInfo对象。
void clear()清空QHostInfo对象,重置为初始状态。
static void swap(QHostInfo &first, QHostInfo &second)交换两个QHostInfo对象的值。

这些函数提供了对主机信息的查询、获取和处理的操作。需要注意,很多函数都是通过异步查询的方式获取主机信息的,因此在使用时需要通过信号-槽机制来获取查询结果。

在使用这个模块时,要确保导入QT+=network模块,接着来看该如何实现查询本机IP地址,通过调用QHostInfo::localHostName可以直接获取到本机的主机名,调用QHostInfo::fromName(hostName)可将该主机名转换为对应的HostInfo结构,当具备了这个结构体以后,就可以通过循环遍历addList.count()内的所有记录,并aHost.toString()输出所有的IP地址表,代码如下所示;

// 查询本机IP地址
void MainWindow::on_pushButton_clicked()
{
    // 本地主机名
    QString hostName=QHostInfo::localHostName();
    std::cout << hostName.toStdString() << std::endl;
    ui->lineEdit->setText(hostName);

    // 查询主机IP地址信息
    QHostInfo hostInfo=QHostInfo::fromName(hostName);

    QList<QHostAddress> addList=hostInfo.addresses();
    if (!addList.isEmpty())
    for (int i=0;i<addList.count();i++)
    {
        // 每一项是一个QHostAddress
        QHostAddress aHost=addList.at(i);

        // 判断是否为IPV4
        if(QAbstractSocket::IPv4Protocol==aHost.protocol())
        {
            ui->listWidget->addItem("IPV4 | " + aHost.toString());
        }
        else
        {
            ui->listWidget->addItem("IPV6 | " + aHost.toString());
        }
    }
}

运行后读者可通过点击查询数据按钮实现对本机IP地址的获取,输出效果如下图所示;

QHostInfo组件既可以查询自身IP地址信息,也可以实现对特定域名的IP解析,通过使用QHostInfo::lookupHost则可以实现查询特定主机的地址信息,该函数需要传入一个回调,如下所示我们在回调函数内查询主机所有的IP地址并输出,其实现原理与上述方法相同。

void MainWindow::lookedUpHostInfo(const QHostInfo &host)
{
    // 每一项是一个QHostAddress
    QList<QHostAddress> addList=host.addresses();
    if (!addList.isEmpty())
    for (int i=0;i<addList.count();i++)
    {
        QHostAddress aHost=addList.at(i);

        // 判断是否为IPV4
        if(QAbstractSocket::IPv4Protocol==aHost.protocol())
        {
            ui->listWidget_2->addItem("IPV4 | " + aHost.toString());
        }
        else
        {
            ui->listWidget_2->addItem("IPV6 | " + aHost.toString());
        }
    }
}

在查询时只需要通过lookupHost调用即可,如下代码所示;

void MainWindow::on_pushButton_2_clicked()
{
    // 主机名
    QString hostname=ui->lineEdit_2->text();
    QHostInfo::lookupHost(hostname,this,SLOT(lookedUpHostInfo(QHostInfo)));
}

运行后读者可通过点击查询数据按钮实现对特定域名的IP地址获取,输出效果如下图所示;

到此这篇关于C++ Qt开发之使用QHostInfo查询主机地址的文章就介绍到这了,更多相关Qt QHostInfo查询主机地址内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言内存函数 memcpy,memmove ,memcmp

    C语言内存函数 memcpy,memmove ,memcmp

    这篇文章主要介绍了C语言内存函数 memcpy,memmove ,memcmp,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09
  • C语言中如何实现单链表删除指定结点

    C语言中如何实现单链表删除指定结点

    这篇文章主要介绍了C语言中如何实现单链表删除指定结点,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • C语言实现简单的计算器

    C语言实现简单的计算器

    这篇文章主要为大家详细介绍了C语言实现简单的计算器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-02-02
  • 深入解析C++编程中范围解析运算符的作用及使用

    深入解析C++编程中范围解析运算符的作用及使用

    这篇文章主要介绍了C++编程中范围解析运算符的使用方法,是C++入门学习中的基础知识,需要的朋友可以参考下
    2016-01-01
  • C++实现双向冒泡排序算法

    C++实现双向冒泡排序算法

    这篇文章主要为大家详细介绍了C++实现双向冒泡排序算法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • C++深入浅出讲解函数重载

    C++深入浅出讲解函数重载

    C++允许多个函数拥有相同的名字,只要它们的参数列表不同就可以,这就是函数的重载(Function Overloading),借助重载,一个函数名可以有多种用途
    2022-05-05
  • 基于C++编写一个文章生成器

    基于C++编写一个文章生成器

    这篇文章主要为大家介绍一个有趣的小程序,就是利用C++编写一个文章生成器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起了解一下
    2023-03-03
  • C/C++连接MySQL并发送SQL请求的实战指南

    C/C++连接MySQL并发送SQL请求的实战指南

    本文将聚焦于 如何使用 C/C++ 连接 MySQL 并发送 SQL 请求,涵盖从环境准备到执行查询的完整流程,并提供可直接运行的示例代码,希望对大家有所帮助
    2026-02-02
  • 一起来看看C++STL容器之string类

    一起来看看C++STL容器之string类

    这篇文章主要为大家详细介绍了C++STL容器之string类,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • C++ 智能指针的魅力你都了解吗

    C++ 智能指针的魅力你都了解吗

    智能指针使用和普通指针类似。解引用一个智能指针返回它指向的对象。如果在一个条件判断中使用智能指针,效果就是检测它是否为空,本文给大家介绍C++ 智能指针的相关知识,感兴趣的朋友一起看看吧
    2021-06-06

最新评论