// NetTest.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include <WinSock2.h>
#include <Iphlpapi.h>
using namespace std;
#pragma comment(lib,"Iphlpapi.lib") //需要添加Iphlpapi.lib库
/*************此部分主要是解释两个结构体,头文件中已经包含,此处无需再次定义***************/
//typedef struct _IP_ADAPTER_INFO {
// struct _IP_ADAPTER_INFO* Next;//指向链表中下一个适配器信息的指针
// DWORD ComboIndex;//预留值
// char AdapterName[MAX_ADAPTER_NAME_LENGTH + 4];//使用ANSI字符串表示的适配器名称
// char Description[MAX_ADAPTER_DESCRIPTION_LENGTH + 4];//使用ANSI字符串表示的适配器描述
// UINT AddressLength;//适配器硬件地址以字节计算的长度
// BYTE Address[MAX_ADAPTER_ADDRESS_LENGTH];//硬件地址以BYTE数组所表示
// DWORD Index;//适配器索引
// UINT Type;//适配器类型,主要有以下几种:
// /*
// * MIB_IF_TYPE_OTHER 1
// * MIB_IF_TYPE_ETHERNET 6
// * MIB_IF_TYPE_TOKENRING 9
// * MIB_IF_TYPE_FDDI 15
// * MIB_IF_TYPE_PPP 23
// * MIB_IF_TYPE_LOOPBACK 24
// * MIB_IF_TYPE_SLIP 28
// */
// UINT DhcpEnabled;//指定这个适配器是否开启DHCP
// PIP_ADDR_STRING CurrentIpAddress;//预留值
// IP_ADDR_STRING IpAddressList;//该适配器的IPv4地址链表
// IP_ADDR_STRING GatewayList;//该适配器的网关IPv4地址链表
// IP_ADDR_STRING DhcpServer;//该适配器的DHCP服务器的IPv4 地址链表
// BOOL HaveWins;
// IP_ADDR_STRING PrimaryWinsServer;
// IP_ADDR_STRING SecondaryWinsServer;
// time_t LeaseObtained;
// time_t LeaseExpires;
//} IP_ADAPTER_INFO, *PIP_ADAPTER_INFO;
//
//
//typedef struct _IP_ADDR_STRING
//{
// struct _IP_ADDR_STRING* Next; //指向同类型节点,即下一个IP(如果有多IP的话)
// IP_ADDRESS_STRING IpAddress; //IP地址信息
// IP_MASK_STRING IpMask; //IP子网掩码
// DWORD Context;// 网络表入口。这个值对应着AddIPAddredd和DeleteIPAddress函数中的NTEContext参数
//} IP_ADDR_STRING;
/*************此部分主要是解释两个结构体,头文件中已经包含,此处无需再次定义***************/
int main(int argc, char* argv[])
{
//PIP_ADAPTER_INFO结构体指针存储本机网卡信息
PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO();
PIP_ADAPTER_INFO pAdapter = NULL;
//得到结构体大小,用于GetAdaptersInfo参数
unsigned long stSize = sizeof(IP_ADAPTER_INFO);
//调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量;其中stSize参数既是一个输入量也是一个输出量
int nRel = GetAdaptersInfo(pIpAdapterInfo, &stSize);
//记录网卡数量
int netCardNum = 0;
//记录每张网卡上的IP地址数量
int IPnumPerNetCard = 0;
if (ERROR_BUFFER_OVERFLOW == nRel)
{
//如果函数返回的是ERROR_BUFFER_OVERFLOW
//则说明GetAdaptersInfo参数传递的内存空间不够,同时其传出stSize,表示需要的空间大小
//这也是说明为什么stSize既是一个输入量也是一个输出量
//释放原来的内存空间
free(pIpAdapterInfo);
//重新申请内存空间用来存储所有网卡信息
pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize];
//再次调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量
nRel = GetAdaptersInfo(pIpAdapterInfo, &stSize);
}
if (ERROR_SUCCESS == nRel)
{
bool isNetInfo = FALSE;//判断是否联网
pAdapter = pIpAdapterInfo;
//输出网卡信息
//可能有多网卡,因此通过循环去判断
while (pAdapter)
{
IP_ADDR_STRING *pIpAddrString = &(pAdapter->IpAddressList);
if (atoi(pIpAddrString->IpAddress.String)!=0)
{
isNetInfo = true;
if (pAdapter->Type == IF_TYPE_IEEE80211)
{
cout << "网卡类型:" << "无线网卡" << endl;
}
else
{
cout << "网卡类型:" << "有线网卡" << endl;
}
cout << "网卡MAC地址:";
for (DWORD i = 0; i < pAdapter->AddressLength; i++)
if (i < pAdapter->AddressLength - 1)
{
printf("%02X-", pAdapter->Address[i]);
}
else
{
printf("%02X\n", pAdapter->Address[i]);
}
cout << "网卡IP地址如下:" << endl;
do
{
cout << "该网卡上的IP数量:" << ++IPnumPerNetCard << endl;
cout << "IP 地址:" << pIpAddrString->IpAddress.String << endl;
cout << "子网地址:" << pIpAddrString->IpMask.String << endl;
cout << "网关地址:" << pAdapter->GatewayList.IpAddress.String << endl;
pIpAddrString = pIpAddrString->Next;
} while (pIpAddrString);
}
pAdapter = pAdapter->Next;
}
if (isNetInfo == false)
{
cout << "请插入网线" << endl;
}
}
//释放内存空间
if (pIpAdapterInfo)
{
free(pIpAdapterInfo);
}
return 0;
}
本文主要借鉴此博客https://www.cnblogs.com/L-hq815/archive/2012/08/04/2622829.html
附:检测无线网络信号强度https://docs.microsoft.com/en-us/windows/win32/api/wlanapi/nf-wlanapi-wlanqueryinterface