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

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


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

相关推荐
长流小哥6 分钟前
Qt 动画学习 入门Qt,怎能少了学动画!
开发语言·qt·学习
_不会dp不改名_1 小时前
Windows10 下QT社区版的安装记录
开发语言·qt
码农新猿类1 小时前
Qt中信号带参传值
qt·qt5
钰爱&2 小时前
【Qt】ffmpeg编码—存储(H264)
c++·qt·ffmpeg
beyond谚语3 小时前
QSettings用法实战(相机配置文件的写入和读取)
qt·qsettings·ini配置文件
HUANG_XIAOJUN3 小时前
Qt warning LNK4042: 对象被多次指定;已忽略多余的指定
qt
胡斌附体5 小时前
Qt下载模板到本地文件内容丢失问题
开发语言·qt
Quz7 小时前
QML输入控件:Dial联动、音频均衡器的实现 (3)
qt
四维碎片9 小时前
【Qt】数据库管理
数据库·c++·qt
sakabu10 小时前
基于Linux C语言多线程服务器+Qt客户端+STM32客户端实现的无人超市项目
linux·服务器·c语言·stm32·单片机·qt·stm32项目