一、简述
今天给大家分享一个获取本机IP地址和Mac地址的方法,经过多次测试,台式机、笔记本等多个设备,暂时没有发现问题。
由于很多时候本地安装了虚拟机、蓝牙、无线网卡或者其他设备等,会有多个Mac地址,所以需要进行多次过滤,其中也是遇到了很多坑,经过多次改进,如果小伙伴们有其他更好的方法,欢迎一起讨论。
二、代码之路
如果是使用VS开发记得添加上Network模块,如果是QtCreator则在pro文件中添加上Qt += Network。
下面就是具体实现代码,大家可以直接拷贝到自己的工程中进行测试
/*********记得Qt模块中加上Network**********/
#include <QNetworkInterface>
void getLocalIpAndMacAddress(QString& ipAddress, QString& macAddress)
{
for (QNetworkInterface netInterface : QNetworkInterface::allInterfaces())
{
//MAC地址
if (netInterface.hardwareAddress().size() == 17)
{
// 包含以太网、Wifi等类型;
QNetworkInterface::InterfaceType type = netInterface.type();
if (type == QNetworkInterface::Ethernet
|| type == QNetworkInterface::Ieee80211
|| type == QNetworkInterface::Wifi) {
QNetworkInterface::InterfaceFlags flags = netInterface.flags();
bool isUp = flags & QNetworkInterface::IsUp;
bool isRunning = flags & QNetworkInterface::IsRunning;
bool isVirtual = flags & QNetworkInterface::IsLoopBack;
macAddress = netInterface.hardwareAddress().replace(":", "-");
QString name = netInterface.humanReadableName();
// 测试信息;
// qDebug() << "macAddress:" << macAddress << "DisplayName:" << netInterface.humanReadableName();
// qDebug() << flags << "\r\n";
// 剔除VMware字段;
if (isUp && isRunning && !isVirtual && !name.contains("VMware")) {
macAddress = netInterface.hardwareAddress().replace(":", "-");
// 获取IPV4地址;
QList<QNetworkAddressEntry> addressEntries = netInterface.addressEntries();
for (QNetworkAddressEntry entry : addressEntries) {
if (entry.ip().protocol() == QAbstractSocket::IPv4Protocol) {
ipAddress = entry.ip().toString();
break;
}
}
// 测试信息;
// qDebug() << QString("IpAdress:%1, MacAddress:%2, DisplayName:%3, Type:%4")
// .arg(ipAddress).arg(macAddress).arg(netInterface.humanReadableName()).arg(type);
if (ipAddress.isEmpty() || macAddress.isEmpty())
continue;
else
break;
}
}
}
}
// check打印(可去除)
if (!ipAddress.isEmpty())
qDebug() << QString("Local IpAddress:%1").arg(ipAddress);
else
qDebug() << "Get local IpAddress failed";
if (!macAddress.isEmpty())
qDebug() << QString("Local MacAddress:%1").arg(macAddress);
else
qDebug() << "Get local MacAddress failed.";
}
void testFunction()
{
QString ipAddress;
QString macAddress;
getLocalIpAndMacAddress(ipAddress, macAddress);
qDebug() << "ipAddress:" << ipAddress;
qDebug() << "macAddress:" << macAddress;
}
大家可以在cmd控制台窗口中通过下面的命令输出本机设备的操作系统中所有网络配置信息。
ipconfig /all
下面以台式机网口插网线为例,可以对比代码执行结果:
觉得有帮助的小伙伴可以手动点个赞,如果很有帮助也可以打赏,一块两块也是情,哈哈哈!