前言
获取主机的网络地址和接口信息是进行网络编程的第一步,也是网络编程的基础。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); }