Qt获取本机Mac地址、Ip地址

一、简述

今天给大家分享一个获取本机IP地址和Mac地址的方法,经过多次测试,台式机、笔记本等多个设备,暂时没有发现问题。

由于很多时候本地安装了虚拟机、蓝牙、无线网卡或者其他设备等,会有多个Mac地址,所以需要进行多次过滤,其中也是遇到了很多坑,经过多次改进,如果小伙伴们有其他更好的方法,欢迎一起讨论。

二、代码之路

如果是使用VS开发记得添加上Network模块,如果是QtCreator则在pro文件中添加上Qt += Network。

下面就是具体实现代码,大家可以直接拷贝到自己的工程中进行测试

cpp 复制代码
/*********记得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

下面以台式机网口插网线为例,可以对比代码执行结果:


觉得有帮助的小伙伴可以手动点个赞,如果很有帮助也可以打赏,一块两块也是情,哈哈哈!

相关推荐
爱码小白1 小时前
PyQt5 学习方法之悟道
开发语言·qt·学习方法
人才程序员14 小时前
QML z轴(z-order)前后层级
c语言·前端·c++·qt·软件工程·用户界面·界面
学习BigData14 小时前
【使用PyQt5和YOLOv11开发电脑屏幕区域的实时分类GUI】——选择检测区域
qt·yolo·分类
yerennuo1 天前
FFmpeg库之ffmpeg
qt·ffmpeg
冷眼看人间恩怨1 天前
【Qt笔记】QComboBox控件详解
c++·笔记·qt
阿松のblog1 天前
pyQt5实现页面切换操作
开发语言·qt
人才程序员1 天前
【无标题】
c语言·前端·c++·qt·软件工程·qml·界面
牵牛老人1 天前
Qt调用adb对嵌入式设备的配置文件进行修改,写入多行内容
数据库·qt·adb
南郁1 天前
答:C++需要学到什么程度再开始学 qt 比较合理?
开发语言·c++·qt·学习
谁刺我心1 天前
QT exe文件设置图标【终极解决方案!】
qt