qt中查看本机mac/ip地址

分享一下,qt中如何获取计算机的mac和ip地址。

首先申明,不能用windows api,为了跨平台。

命令行查看
win+R cmd 出现命令提示行,键入:
ipconfig/all
qt中查看本机mac/ip地址_第1张图片

QT中获取mac地址

QString getMacAddress()
{
    QString text;
    foreach(QNetworkInterface interface, QNetworkInterface::allInterfaces())
    {
        text += "Interface:"+interface.hardwareAddress()+"\n";
        if (!(interface.flags() & QNetworkInterface::IsRunning))
        {
          text = interface.hardwareAddress();
          qDebug() << text;
          return text;
        }
    }
}

把E4:F8:9C:D9:84:B1形式转为uint8_t 数组

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QString>
#include "QtNetwork/qnetworkinterface.h"
#include "qdebug.h"
#include <qdatetime.h>
#include <sstream>

QString getMacAddress()
{
    QString text;
    foreach(QNetworkInterface interface, QNetworkInterface::allInterfaces())
    {
        text += "Interface:"+interface.hardwareAddress()+"\n";
        if (!(interface.flags() & QNetworkInterface::IsRunning))
        {
          text = interface.hardwareAddress();
          qDebug() << text;
          return text;
        }


    }
}

int main(int argc, char *argv[])
{
    uint8_t tgt_mac[6] = {0};
    std::stringstream ss( getMacAddress().toStdString() );
    char trash;

    for ( int i = 0; i < 6; i++ )
    {
        int foo;
        ss >> std::hex >> foo >> trash;
        tgt_mac[i] = foo;
    }


    for (int i=0; i < 6; i++)
    {
        qDebug() << tgt_mac[i];
    }

    QGuiApplication app(argc, argv);


    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));



    return app.exec();
}

获得更多参数

#include <QCoreApplication>
#include <WinSock2.h>
#include <iphlpapi.h>
#include <QDebug>
#include <QNetworkInterface>

void getLocalIpWithQt();
void getAdapterInfoWithQt();
void getAdapterInfoWithWindows();
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
// getLocalIpWithQt();
// getAdapterInfoWithQt();
    getAdapterInfoWithWindows();
    return a.exec();
}

void getLocalIpWithQt()
{
    QList<QHostAddress> ipList = QNetworkInterface::allAddresses();
    foreach(QHostAddress ipItem, ipList)
    {
        //只显示以192开头的IP地址
        if(ipItem.protocol()==QAbstractSocket::IPv4Protocol&&ipItem!=QHostAddress::Null
                &&ipItem!=QHostAddress::LocalHost&&ipItem.toString().left(3)=="192")
        {
            qDebug()<<ipItem.toString();
        }
    }
}

void getAdapterInfoWithQt()
{
    QList<QNetworkInterface> interfaceList = QNetworkInterface::allInterfaces();

    foreach(QNetworkInterface interfaceItem, interfaceList)
    {
        if(interfaceItem.flags().testFlag(QNetworkInterface::IsUp)
                &&interfaceItem.flags().testFlag(QNetworkInterface::IsRunning)
                &&interfaceItem.flags().testFlag(QNetworkInterface::CanBroadcast)
                &&interfaceItem.flags().testFlag(QNetworkInterface::CanMulticast)
                &&!interfaceItem.flags().testFlag(QNetworkInterface::IsLoopBack)
                &&interfaceItem.hardwareAddress()!="00:50:56:C0:00:01"
                &&interfaceItem.hardwareAddress()!="00:50:56:C0:00:08")
        {
            QList<QNetworkAddressEntry> addressEntryList=interfaceItem.addressEntries();
            foreach(QNetworkAddressEntry addressEntryItem, addressEntryList)
            {
                if(addressEntryItem.ip().protocol()==QAbstractSocket::IPv4Protocol)
                {
                    qDebug()<<"------------------------------------------------------------";
                    qDebug()<<"Adapter Name:"<<interfaceItem.name();
                    qDebug()<<"Adapter Address:"<<interfaceItem.hardwareAddress();
                    qDebug()<<"IP Address:"<<addressEntryItem.ip().toString();
                    qDebug()<<"IP Mask:"<<addressEntryItem.netmask().toString();
                }
            }
        }
    }
}

void getAdapterInfoWithWindows()
{
    //PIP_ADAPTER_INFO结构体存储本机网卡信息,包括本地网卡、无线网卡和虚拟网卡
    PIP_ADAPTER_INFO pAdapterInfo=(IP_ADAPTER_INFO *) malloc(sizeof(IP_ADAPTER_INFO));
    ULONG ulOutBufLen = sizeof(IP_ADAPTER_INFO);
    //调用GetAdaptersInfo函数,填充pAdapterInfo指针变量,其中ulOutBufLen参数既是输入也是输出
    if(GetAdaptersInfo( pAdapterInfo, &ulOutBufLen) != ERROR_SUCCESS)
    {
        //如果分配失败,释放后重新分配
        GlobalFree (pAdapterInfo);
        pAdapterInfo = (IP_ADAPTER_INFO *) malloc (ulOutBufLen);
    }
    if(GetAdaptersInfo( pAdapterInfo, &ulOutBufLen) == NO_ERROR)
    {
        while (pAdapterInfo)
        {
            //pAdapter->Description中包含"PCI"为本地网卡,pAdapter->Type是71为无线网卡
            if(strstr(pAdapterInfo->Description,"PCI") > 0|| pAdapterInfo->Type == 71)
            {
                //这里假设每个网卡只有一个IP
                char * ipAddress=pAdapterInfo->IpAddressList.IpAddress.String;
                char tempIpAddress[3]={'\0'};
                memcpy(tempIpAddress,ipAddress,3);
                //只显示IP以192开头的网卡信息
                if(strstr(tempIpAddress,"192"))
                {
                    printf("------------------------------------------------------------\n");
                    printf("Adapter Name: \t%s\n", pAdapterInfo->AdapterName);
                    printf("Adapter Description: \t%s\n", pAdapterInfo->Description);
                    printf("Adapter Address: \t");
                    for (UINT i = 0; i < pAdapterInfo->AddressLength; i++)
                    {
                        printf("%02X%c", pAdapterInfo->Address[i],
                        i == pAdapterInfo->AddressLength - 1 ? '\n' : '-');
                    }
                    printf("Adapter Type: \t%d\n", pAdapterInfo->Type);
                    printf("IP Address: \t%s\n", pAdapterInfo->IpAddressList.IpAddress.String);
                    printf("IP Mask: \t%s\n", pAdapterInfo->IpAddressList.IpMask.String);
                }
            }
            pAdapterInfo = pAdapterInfo->Next;
        }
    }
    else
    {
        printf("Call to GetAdaptersInfo failed.\n");
    }
    if(pAdapterInfo)
    {
        GlobalFree (pAdapterInfo);
    }
}

你可能感兴趣的:(mac,qt)