#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);
}
}
评论8
最新资源