Qt获取当前系统网络接口信息

发布时间:2024年01月13日
1.QInterface获取网络接口信息
void NetProperty::init()
{
    // 获取所有网络接口
    const QList<QNetworkInterface> interfaces = QNetworkInterface::allInterfaces();
    ui->com_Interface->clear();
    for(const QNetworkInterface& interface : interfaces){
        ui->com_Interface->addItem(interface.humanReadableName(), interface.name());       // 显示所有网络接口名称
    }
}

void NetProperty::on_com_Interface_activated(int index)
{
    Q_UNUSED(index)
    QString strName = ui->com_Interface->currentData().toString();
    QNetworkInterface interface =  QNetworkInterface::interfaceFromName(strName);   // 根据选择名称获取网卡
    if(!interface.isValid())   // 判断接口有效
        return;

    ui->tableWidget->item(0, 1)->setText(QString::number(interface.index()));                     // 获取网卡索引
#if (QT_VERSION >= QT_VERSION_CHECK(5,11,0))        // qt5.11以后版本才有
    ui->tableWidget->item(1, 1)->setText(QString::number(interface.maximumTransmissionUnit()));   // 获取网卡最大传输数据单元
#endif
    ui->tableWidget->item(2, 1)->setText(interface.name());                                       // 获取网卡名称

#if 0    // 直接显示标志枚举
    QNetworkInterface::InterfaceFlags flags = interface.flags();
    QMetaEnum metaEnum = QMetaEnum::fromType<QNetworkInterface::InterfaceFlags>();
    ui->tableWidget->item(3, 1)->setText(metaEnum.valueToKeys(flags));                            // 返回与此网络接口关联的标志
#else
    ui->tableWidget->item(3, 1)->setText(FlagsToQString(interface.flags()));
#endif
#if (QT_VERSION >= QT_VERSION_CHECK(5,11,0))        // qt5.11以后版本才有
    ui->tableWidget->item(4, 1)->setText(TypeToQString(interface.type()));                        // 获取网络类型说明
#endif
    ui->tableWidget->item(5, 1)->setText(interface.hardwareAddress());                            // // 获取MAC地址

    ui->textEdit_ip->clear();
    // 如果只是获取所有的IP地址可以使用allAddresses()函数
    const QList<QNetworkAddressEntry> entrys = interface.addressEntries();  // 返回此接口拥有的 IP 地址列表及其关联的网络掩码和广播地址。
    for(auto entery : entrys)
    {
        QString strType;
        switch (entery.ip().protocol())       // 判断IP地址类型
        {
        case QAbstractSocket::IPv4Protocol:
            strType = "--------IPv4地址--------";
            break;
        case QAbstractSocket::IPv6Protocol:
            strType = "--------IPv6地址--------";
            break;
        case QAbstractSocket::AnyIPProtocol:
            strType = "--------IPv4或IPv6地址--------";
            break;
        case QAbstractSocket::UnknownNetworkLayerProtocol:
            strType = "--------未知地址--------";
            break;
        }
        ui->textEdit_ip->append(strType);             // 显示IP地址类型
        QString ipInfo = QString("IP地址:%1,子网掩码:%2,广播地址:%3").arg(entery.ip().toString())
                .arg(entery.netmask().toString())
                .arg(entery.broadcast().toString());
        ui->textEdit_ip->append(ipInfo);              // 显示IP地址信息
    }
}

/**
 * @brief        将网卡关联标志转换为可读的说明信息
 * @param flags
 * @return
 */
QString NetProperty::FlagsToQString(int flags)
{
    QString strFlags;
    if(flags & QNetworkInterface::IsUp)
    {
        strFlags += "网络接口处于活动状态";
    }
    if(flags & QNetworkInterface::IsRunning)
    {
        strFlags.append(strFlags.isEmpty() ? "" : " | ");
        strFlags += "网络接口已分配资源";
    }
    if(flags & QNetworkInterface::CanBroadcast)
    {
        strFlags.append(strFlags.isEmpty() ? "" : " | ");
        strFlags += "网络接口工作在广播模式";
    }
    if(flags & QNetworkInterface::IsLoopBack)
    {
        strFlags.append(strFlags.isEmpty() ? "" : " | ");
        strFlags += "网络接口是一个环回接口";
    }
    if(flags & QNetworkInterface::IsPointToPoint)
    {
        strFlags.append(strFlags.isEmpty() ? "" : " | ");
        strFlags += "网络接口是一个点对点接口";
    }
    if(flags & QNetworkInterface::CanMulticast)
    {
        strFlags.append(strFlags.isEmpty() ? "" : " | ");
        strFlags += "网络接口支持组播";
    }
    return strFlags;
}


/**
 * @brief        返回网卡类型说明
 * @param type   网卡类型枚举
 * @return       网卡类型说明
 */
QString NetProperty::TypeToQString(int type)
{
#if (QT_VERSION >= QT_VERSION_CHECK(5,11,0))        // qt5.11以后版本才有
    switch (type)
    {
    case QNetworkInterface::Loopback: return "虚拟环回接口,分配了环回 IP 地址 (127.0.0.1, ::1)";
    case QNetworkInterface::Virtual:  return "一种确定为虚拟的接口类型,但不是任何其他可能的类型";
    case QNetworkInterface::Ethernet: return "IEEE 802.3 以太网接口";
    case QNetworkInterface::Slip:     return "串行线路互联网协议接口";
    case QNetworkInterface::CanBus:   return "ISO 11898 控制器局域网总线接口";
    case QNetworkInterface::Ppp:      return "点对点协议接口,通过较低的传输层(通常通过无线电或物理线路串行)在两个节点之间建立直接连接";
    case QNetworkInterface::Fddi:     return "ANSI X3T12 光纤分布式数据接口,一种光纤局域网";
    case QNetworkInterface::Wifi:     return "IEEE 802.11 Wi-Fi 接口";         // 别名 Ieee80211
    case QNetworkInterface::Phonet:   return "使用 Linux Phonet socket系列的接口,用于与蜂窝调制解调器通信";
    case QNetworkInterface::Ieee802154: return "IEEE 802.15.4 个人区域网络接口,6LoWPAN 除外";
    case QNetworkInterface::SixLoWPAN:  return "6LoWPAN(低功耗无线个人区域网络上的 IPv6)接口,通常用于网状网络";
    case QNetworkInterface::Ieee80216:  return "IEEE 802.16 无线城域网";
    case QNetworkInterface::Ieee1394:   return "IEEE 1394 接口(又名“FireWire”)";
    case QNetworkInterface::Unknown:    return "接口类型无法确定或不是其他列出的类型之一";
    default:return "未知";
    }
#else
    Q_UNUSED(type)
#endif
}
2.QHostInfo获取网络接口信息

QHostInfo类用于获取主机的一些网络信息。QHostInfo类有下面这些公有函数:

  • [static] QString QHostInfo::localHostName(),函数获取本机主机名。
  • [static] QHostInfo QHostInfo::fromName(const QString &name),函数根据主机名获取主机的信息。
  • [static] QString QHostInfo::localDomainName(),函数返回本机DNS域名。
  • [static] int QHostInfo::lookupHost(const QString &name, QObject receiver, const char member),以异步方式查找主机的IP地址,并返回一个表示本次查找的ID。name参数表示主机名,可以为主机名、域名或IP地址。参数receiver指定槽函数的接收者,member指定槽函数的名称。异步方式表示执行lookupHost后,程序可能需要花一定时间用来查找,但不阻塞程序的继续执行(类似多线程),查找完毕后,通过信号通知设定的槽函数,在槽函数里读取查找的结果。
#include <QHostInfo>
QString hostName = QHostInfo::localHostName();//获取本机主机名
QHostInfo hostInfo = QHostInfo::fromName(hostName);//获取本机信息
QList<QHostAddress> addList=hostInfo.addresses();//获取IP地址列表
if (!addList.isEmpty())
    for(int i=0;i<addList.count();i++)
    {
    QHostAddress aHost=addList.at(i); //每一项是一个QHostAddress
    QAbstractSocket::NetworkLayerProtocol protocol = aHost.protocol();//返回协议类型
    QString protocolType;
    switch(protocol){
        case QAbstractSocket::IPv4Protocol:
            protocolType = "IPv4 Protocol";
            break;
       case QAbstractSocket::IPv6Protocol:
              protocolType = "IPv6 Protocol";
              break;
        case QAbstractSocket::AnyIPProtocol:
              protocolType = "Any IP Protocol";
        default:
              protocolType = "Unknown Network Layer Protocol";
       }
    QString IPAddress = aHost.toString();//返回IP地址的字符串
    }

lookupHost()函数使用:

//用lookupHost根据主机名、域名或IP地址查找主机相关信息
QString hostname=ui->editHost->text(); //获取主机名
//查找主机名为hostname的主机信息,查找完毕后执行this对象的槽函数lookedUpHostInfo(QHostInfo)
QHostInfo::lookupHost(hostname,this,SLOT(lookedUpHostInfo(QHostInfo)));

//槽函数部分代码
void Dialog::lookedUpHostInfo(const QHostInfo &host){
    QList<QHostAddress> addList=host.addresses();//获取IP地址列表
}

文章来源:https://blog.csdn.net/weixin_55238862/article/details/135572387
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。