windows平台下获取有线和无线的ip地址比在Linux中麻烦一些,下面介绍一种利用QT自带接口实现IP地址的获取。
接口介绍
QT自带的网络接口类:QNetworkInterface ,下面介绍一下类相关成员及功能
公共类型
1、接口标志
enum InterfaceFlag {
IsUp, IsRunning, CanBroadcast, IsLoopBack, IsPointToPoint, CanMulticast }
详细信息如下:
QNetworkInterface::IsUp 0x1 网络接口激活
QNetworkInterface::IsRunning 0x2 网络接口已经被分配资源
QNetworkInterface::CanBroadcast 0x4 支持广播
QNetworkInterface::IsLoopBack 0x8 环回接口
QNetworkInterface::IsPointToPoint 0x10 点对点接口
QNetworkInterface::CanMulticast 0x20 支持多播
2、接口类型
enum InterfaceType {
Unknown, Loopback, Virtual, Ethernet, Wifi, Ieee1394 }
常用类型:
QNetworkInterface::Ethernet 3 有线接口类型
QNetworkInterface::Wifi 8 无线接口类型
常用公共接口
1、获取当前的flag
QNetworkInterface::InterfaceFlags flags() const
2、获取当前的MAC地址
QString hardwareAddress() const
3、获取当前的接口类型
QNetworkInterface::InterfaceType type() const
4、获取地址实体列表
QList<QNetworkAddressEntry> addressEntries() const
5、是否有效
bool isValid() const
6、获取index
int QNetworkInterface::index() const
静态成员接口
1、获取所有接口信息
QList<QNetworkInterface> allInterfaces()
2、根据索引获取接口信息
QNetworkInterface interfaceFromIndex(int index)
3、根据名称获取接口信息
QNetworkInterface interfaceFromName(const QString &name)
4、根据index获取接口名字
QString interfaceNameFromIndex(int index)
实现原理
通过 allInterfaces()接口获取所有的接口信息列表,遍历列表,根据flag和type识别出激活状态下的wifi和eth的IP地址。
实现代码
#include <Windows.h>
#include <fileapi.h>
#include <qdebug.h>
#include <QNetworkInterface>
#include <QNetworkAddressEntry>
#include <QList>
void getipaddress()
{
QString text;
QTextStream out(&text);
QList<QNetworkInterface> ifaceList = QNetworkInterface::allInterfaces();
for (int i = 0; i < ifaceList.count(); i++) {
QNetworkInterface var = ifaceList.at(i);
qDebug()<<var.type()<<" ";
qDebug()<<var.flags()<<endl;
if (!(var.flags() & QNetworkInterface::IsUp) || !(var.flags() & QNetworkInterface::IsRunning)) {
continue;
}
if (var.humanReadableName() != "Wi-Fi" && var.humanReadableName() != "Ethernet") {
continue;
}
// 读取一个IP地址的关联信息列表
QList<QNetworkAddressEntry> entryList = var.addressEntries();
for(int j = 0; j < entryList.count(); j++) {
QNetworkAddressEntry entry = entryList.at(j);
qDebug()<<" IP地址:"<<entry.ip().toString()<<endl;
}
}
}
int main(int argc, char *argv[])
{
getipaddress();
int a;
scanf("%d", &a);
return 0;
}