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获取网络信息内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!