检测电脑是否联网成功,以及判断所联网络是否为无线或者有线

本文介绍了一个C++程序,用于获取Windows系统中的网络适配器信息,包括网卡类型、MAC地址、IP地址等。程序通过调用GetAdaptersInfo函数来获取信息,并展示了如何处理缓冲区大小不足的情况。此外,还提供了如何判断网络是否连接的逻辑。
摘要由CSDN通过智能技术生成
// 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/zh-cn/windows/win32/api/iphlpapi/nf-iphlpapi-getadaptersinfo?redirectedfrom=MSDN

附:检测无线网络信号强度https://docs.microsoft.com/en-us/windows/win32/api/wlanapi/nf-wlanapi-wlanqueryinterface

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值