[Qt网络编程]之获取基本网络信息

目录

前言

获取主机IP地址

[获取主机 IP 地址和子网掩码](#获取主机 IP 地址和子网掩码)

[获取主机 MAC 地址](#获取主机 MAC 地址)


前言

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

获取网络信息的步骤是:

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

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

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

cpp 复制代码
QT+=core qui network

获取主机IP地址

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

cpp 复制代码
#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 类的静态方法,也可以用下面的代码直接获得地址列表。

cpp 复制代码
QList<QHostAddress> addresslist = QNetworkInterface::allAddresses ()

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


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

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

cpp 复制代码
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地址。

cpp 复制代码
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平台的一些内容,接下来还有一些网络编程的内容,希望大家可以关注我,我很希望能在这里和大家一起交流学习!!!大家也可以私信我哦!!!共同进步!!!

相关推荐
安迁岚1 分钟前
【SQL Server】华中农业大学空间数据库实验报告 实验三 数据操作
运维·服务器·数据库·sql·mysql
HackKong10 分钟前
小白怎样入门网络安全?
网络·学习·安全·web安全·网络安全·黑客
vmlogin虚拟多登浏览器20 分钟前
虚拟浏览器可以应对哪些浏览器安全威胁?
服务器·网络·安全·跨境电商·防关联
澜世30 分钟前
2024小迪安全基础入门第三课
网络·笔记·安全·网络安全
姆路31 分钟前
QT Designer内存飙升
qt
追风赶月、1 小时前
【Linux】线程概念与线程控制
linux·运维·服务器
Bruce小鬼2 小时前
QT文件基本操作
开发语言·qt
ZZZCY20033 小时前
华为ENSP--IP编址及静态路由配置
网络·华为
懷淰メ3 小时前
PyQt飞机大战游戏(附下载地址)
开发语言·python·qt·游戏·pyqt·游戏开发·pyqt5
EasyCVR3 小时前
私有化部署视频平台EasyCVR宇视设备视频平台如何构建视频联网平台及升级视频转码业务?
大数据·网络·音视频·h.265