Qt实现获取基本网络信息

 更新时间:2024年04月18日 08:30:25   作者:三号原子  
这篇文章主要为大家详细介绍了Qt实现获取基本网络信息的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

前言

获取主机的网络地址和接口信息是进行网络编程的第一步,也是网络编程的基础。Qt提供了网络接口类 QNetworkInterface、网络地址人口类 QNetworkAddressEntry 和主机地址类 QHostAddress 来获取和使用地址信息。其中网络接口类 QNetworkInterface 描述了主机的卫地址和接口列表,网络地址人口类 QNetworkAddressEntry 用于存放 IP 地址、子网掩码和广播地址,主机地址类QHostAddress 用于定义 Qt 环境下的地址类型。

 获取网络信息的步骤是:

  • 首先定义 QNetworkInterface 的实例,通过 QNetworkInterface 实例的 allAddresses()方法,得到主机地址 QHostAddress 的列表。
  • 如果需要获得 IP 地址、子网掩码,通过 QNetworkInterface 实例的 addressEntries()方法,获得网络地址入口 QNctworkAddressEntry 的列表。
  • 如果需要获得网络物理 MAC 地址,通过 QNetworkInterface 实例的 hardwareAddress()方法,获得网络物理地址。

下面用一个综合的例子来演示这三个类的使用,新建一个工程,设计 ui 界面,其中三个按钮分别演示上述的三个步骤,右边是文本浏览器TextBrowser 部件。

在工程文件 *.pro 中添加 network 选项后编译:

QT+=core qui network

获取主机IP地址

在on_pushButton_clicked()函数中直接从网络接口类中获得主机地址列表:

#include<QNetworkInterface>
void MainWindow::on_pushButton_clicked()
{
    QNetworkInterface thisComputer;//实例化网络接口类
    QList<QHostAddress> addressList;//创建主机地址列表
    addressList = thisComputer.allAddresses();//获取所有主机地址
    QString displaystring;//用来存储获取来的地址
    int i;
    for(i=0;i<addressList.size();i++){
        displaystring+=tr("IPAddress %1:\n").arg(i+1);
        //前面的“%1”显示的内容是后面arg里面的内容为了显示是第几个地址
        displaystring+=addressList.at(i).toString()+"\n";
        //将对应的第几个地址添加到存储字符串中
    }
    ui->textBrowser->setText(displaystring);//在文本显示区域里面显示
}

其中 QNetworkInterface 类中 allAddresses() 方法是 QNetworkInterface 类的静态方法,也可以用下面的代码直接获得地址列表。

QList<QHostAddress> addresslist = QNetworkInterface::allAddresses ()

这种方法,直接从 QNetworkInterface 获取主机地址信息,方便快捷;缺点是不能同时获得相应的子网掩码信息。

获取主机 IP 地址和子网掩码

继续完成 GetNetworkEntry 按钮实现,该按钮的功能是从 QNetworkAddressEntry 类中获得 IP 地址和子网掩码。获取 QNetworkAddressEntry 的方法稍微复杂一些,需要首先通过 allInterfaces() 获得实际的网络接口列表,再通过列表中的 addressEntries()函数获得网络地址人口,最后根据网络地址入口检索出 IP 地址和子网掩码。

void MainWindow::on_pushButton_2_clicked()
{
    QNetworkInterface thisComputer;//实例化网络接口类
    QList<QNetworkAddressEntry> addressEntry;//创建网络地址列表
    QList<QNetworkInterface> networkInterfaceList;//网络接口类列表
    QString displaystring;
    networkInterfaceList = thisComputer.allInterfaces();//获取主机的所有网络接口
    int i;
    for(i=0; i< networkInterfaceList.size();i++){
        displaystring += tr("Network Interface %1:\n").arg(i+1);
        //前面的“%1”显示的内容是后面arg里面的内容为了显示是第几个网络接口
        displaystring += networkInterfaceList.at(i).name()+"\n";
        //获取网络接口名称
        addressEntry = networkInterfaceList.at(i).addressEntries();
        //获取对应的网络接口的所有子网掩码
        for(int j=0;j<addressEntry.size();j++){
            displaystring += addressEntry.at(j).ip().toString()+ "\n";
            displaystring += addressEntry.at(j).netmask().toString()+"\n";
        }
    }
    ui->textBrowser->setText(displaystring);
}

在上面的代码中:addressEntry.at(j).ip()和 addressEntry. at(j).netmask()返回QHostAddress 的实例,用 QHostAddress 类 toString 的方法直接输出地址值。

获取主机 MAC 地址 

获取主机 MAC 地址的方法和上面类似。有时候,一个网卡上支持了多个网络接口,所以不是每个网络接口都有 MAC地址,在本例子中,可以看到网络接口6没有 MAC地址。 

void MainWindow::on_pushButton_3_clicked()
{
    QNetworkInterface thisComputer;//实例化网络接口类
    QList<QNetworkInterface> networkInterfaceList;//网络接口类列表
    QString displaystring;
    networkInterfaceList = thisComputer.allInterfaces();//获取主机的所有网络接口
    int i;
    for(i=0;i<networkInterfaceList.size();i++){
        displaystring+=tr("Network Interface %1:\n").arg(i+1);
        displaystring+=networkInterfaceList.at(i).name()+ "\n";
        displaystring+=networkInterfaceList.at(i).hardwareAddress()+ "\n";
    }
    ui->textBrowser->setText(displaystring);
}

到此这篇关于Qt实现获取基本网络信息的文章就介绍到这了,更多相关Qt获取网络信息内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 利用上下文属性将 C++ 对象嵌入 QML 里

    利用上下文属性将 C++ 对象嵌入 QML 里

    这篇文章主要介绍了利用上下文属性将 C++ 对象嵌入 QML里,将 QML 对象加载到 C++ 应用程序中时,直接嵌入一些可在 QML 代码中使用的 C++ 数据会很有用。例如,这使得在嵌入对象上调用 C++ 方法或使用 C++ 对象实例作为 QML 视图的数据模型成为可能,下面一起来学习该内容吧
    2021-12-12
  • C++ 汉诺塔问题知识点总结

    C++ 汉诺塔问题知识点总结

    在本篇文章里小编给大家整理的是关于C++ 汉诺塔问题知识点内容,有需要的朋友们可以参考下。
    2020-02-02
  • C++ JSON库 nlohmann::basic_json::array 的用法示例详解

    C++ JSON库 nlohmann::basic_json::array 的用法示例详解

    nlohmann::json是一个C++的JSON库,它提供了一种容易和直观的方法来处理JSON数据,nlohmann::json::array()是用来创建一个JSON数组的方法,这篇文章主要介绍了C++ JSON库nlohmann::basic_json::array的用法,需要的朋友可以参考下
    2023-06-06
  • C/C++实现crc码计算和校验

    C/C++实现crc码计算和校验

    循环冗余校验(Cyclic Redundancy Check, CRC)是一种根据网络数据包或计算机文件等数据产生简短固定位数校验码的一种信道编码技术。本文主要介绍了C++实现crc码计算和校验的方法,需要的可以参考一下
    2023-03-03
  • C调用C++代码的方法步骤

    C调用C++代码的方法步骤

    本文主要介绍了C调用C++代码的方法步骤,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • Matlab实现四种HSV色轮图绘制的示例代码

    Matlab实现四种HSV色轮图绘制的示例代码

    色轮图就是色彩相位图,它完整表现了色相环360度的全部颜色。本文将利用Matlab语言绘制四种不同的HSV色轮图,感兴趣的可以动手尝试一下
    2022-07-07
  • C语言指针基础详解

    C语言指针基础详解

    这篇文章主要介绍了C语言指针的基础,主要对C语言中指针的本质及常见用法做了较为通俗易懂的分析,是后续深入学习C语言的基础,需要的朋友可以参考下
    2021-10-10
  • C++11新特性之右值引用与完美转发详解

    C++11新特性之右值引用与完美转发详解

    C++11标准为C++引入右值引用语法的同时,还解决了一个短板,即使用简单的方式即可在函数模板中实现参数的完美转发。本文就来讲讲二者的应用,需要的可以参考一下
    2022-09-09
  • C++ 如何实现一个日期类

    C++ 如何实现一个日期类

    通过对类和对象的学习,理解了类是对象的抽象描述,实现日期类涉及定义年月日属性及成员函数如打印日期、日期加减,重点介绍了运算符重载的概念和作用,通过代码示例展示了如何实现一个日期类,包括头文件和源文件的分离编写
    2024-10-10
  • C语言深入探究动态规划之线性DP

    C语言深入探究动态规划之线性DP

    线性动态规划,是较常见的一类动态规划问题,其是在线性结构上进行状态转移,这类问题不像背包问题、区间DP等有固定的模板,线性动态规划的目标函数为特定变量的线性函数,约束是这些变量的线性不等式或等式,目的是求目标函数的最大值或最小值
    2022-04-04

最新评论