qt中查看本机mac/ip地址
分享一下,qt中如何获取计算机的mac和ip地址。
首先申明,不能用windows api,为了跨平台。
命令行查看
win+R cmd 出现命令提示行,键入:
ipconfig/all
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;
}
}
}
把E49C
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);
}
}
还没有评论,来说两句吧...