Qt中 IPv4和Mac的相互获取

13 08月
作者:cinjep|分类:应用笔记
/**
 * @brief 根据MAC地址获取对应的IPv4地址
 * @param targetMac 目标MAC地址,格式如 "00:11:22:AA:BB:CC"
 * @return 对应的IPv4地址字符串,如果未找到则返回空字符串
 */
QString getIPv4ByMac(const QString &targetMac)
{
    // 1. 获取所有网络接口列表
    QList<QNetworkInterface> interfaces = QNetworkInterface::allInterfaces();

    // 2. 遍历所有接口
    for (const QNetworkInterface &interface : interfaces) {
        // 3. 检查当前接口的MAC地址是否与目标MAC匹配
        //    为了更健壮,可以先将MAC地址转为大写再比较
        if (interface.hardwareAddress().toUpper() == targetMac.toUpper()) {
            // 4. 找到匹配的接口后,遍历其所有地址条目
            QList<QNetworkAddressEntry> entries = interface.addressEntries();
            for (const QNetworkAddressEntry &entry : entries) {
                QHostAddress ip = entry.ip();
                // 5. 筛选出IPv4协议的地址
                if (ip.protocol() == QAbstractSocket::IPv4Protocol) {
                    return ip.toString();
                }
            }
        }
    }

    // 如果遍历完所有接口都没有找到,返回空字符串
    return QString();
}


/**
 * @brief 根据指定的 IPv4 地址查找对应的 MAC 地址
 * @param targetIp 目标 IPv4 地址字符串,例如 "192.168.1.100"
 * @return 对应的 MAC 地址字符串,如果未找到则返回空字符串
 */
QString getMacByIp(const QString &targetIp)
{
    QHostAddress targetAddress(targetIp);
    // 确保传入的是有效的 IPv4 地址
    if (targetAddress.protocol() != QAbstractSocket::IPv4Protocol) {
        qDebug() << "错误:请输入有效的 IPv4 地址";
        return QString();
    }

    // 1. 获取所有网络接口
    QList<QNetworkInterface> interfaces = QNetworkInterface::allInterfaces();

    // 2. 遍历所有接口
    for (const QNetworkInterface &interface : interfaces) {
        // 过滤掉未启动或回环的接口
        if (!(interface.flags() & QNetworkInterface::IsUp) ||
            (interface.flags() & QNetworkInterface::IsLoopBack)) {
            continue;
        }

        // 3. 获取当前接口的所有地址条目
        QList<QNetworkAddressEntry> entries = interface.addressEntries();
        for (const QNetworkAddressEntry &entry : entries) {
            QHostAddress ip = entry.ip();
            // 4. 检查是否为 IPv4 地址,并与目标地址比较
            if (ip.protocol() == QAbstractSocket::IPv4Protocol && ip == targetAddress) {
                // 找到匹配的 IP,返回该接口的 MAC 地址
                return interface.hardwareAddress();
            }
        }
    }

    // 未找到匹配的 IP 地址
    return QString();
}


浏览45
返回
目录
返回
首页
Qt5 C++ 通过构造函数向子窗体传递参数demo