// 这里是其他函数实现的源Demo
#include <winsock2.h>
#include <iphlpapi.h>
#include <iostream>

int NetWorkInter()
{
	//PIP_ADAPTER_INFO结构体指针存储本机网卡信息
	PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO();
	//得到结构体大小,用于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既是一个输入量也是一个输出量
		//释放原来的内存空间
		delete pIpAdapterInfo;
		//重新申请内存空间用来存储所有网卡信息
		pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize];
		//再次调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量
		nRel = GetAdaptersInfo(pIpAdapterInfo, &stSize);
	}
	if (ERROR_SUCCESS == nRel)
	{
		//输出网卡信息
		//可能有多网卡,因此通过循环去判断
		while (pIpAdapterInfo)
		{
			std::cout << "网卡数量:" << ++netCardNum << std::endl;
			std::cout << "网卡名称:" << pIpAdapterInfo->AdapterName << std::endl;
			std::cout << "网卡描述:" << pIpAdapterInfo->Description << std::endl;
			switch (pIpAdapterInfo->Type)
			{
			case MIB_IF_TYPE_OTHER:
				std::cout << "网卡类型:" << "OTHER" << std::endl;
				break;
			case MIB_IF_TYPE_ETHERNET:
				std::cout << "网卡类型:" << "ETHERNET" << std::endl;
				break;
			case MIB_IF_TYPE_TOKENRING:
				std::cout << "网卡类型:" << "TOKENRING" << std::endl;
				break;
			case MIB_IF_TYPE_FDDI:
				std::cout << "网卡类型:" << "FDDI" << std::endl;
				break;
			case MIB_IF_TYPE_PPP:
				printf("PP\n");
				std::cout << "网卡类型:" << "PPP" << std::endl;
				break;
			case MIB_IF_TYPE_LOOPBACK:
				std::cout << "网卡类型:" << "LOOPBACK" << std::endl;
				break;
			case MIB_IF_TYPE_SLIP:
				std::cout << "网卡类型:" << "SLIP" << std::endl;
				break;
			default:

				break;
			}
			std::cout << "网卡MAC地址:";
			for (DWORD i = 0; i < pIpAdapterInfo->AddressLength; i++)
				if (i < pIpAdapterInfo->AddressLength - 1)
				{
					printf("%02X-", pIpAdapterInfo->Address[i]);
				}
				else
				{
					printf("%02X\n", pIpAdapterInfo->Address[i]);
				}
			std::cout << "网卡IP地址如下:" << std::endl;
			//可能网卡有多IP,因此通过循环去判断
			IP_ADDR_STRING *pIpAddrString = &(pIpAdapterInfo->IpAddressList);
			do
			{
				std::cout << "该网卡上的IP数量:" << ++IPnumPerNetCard << std::endl;
				std::cout << "IP 地址:" << pIpAddrString->IpAddress.String << std::endl;
				std::cout << "子网地址:" << pIpAddrString->IpMask.String << std::endl;
				std::cout << "网关地址:" << pIpAdapterInfo->GatewayList.IpAddress.String << std::endl;
				pIpAddrString = pIpAddrString->Next;
			} while (pIpAddrString);
			pIpAdapterInfo = pIpAdapterInfo->Next;
			std::cout << "--------------------------------------------------------------------" << std::endl;
		}

	}
	//释放内存空间
	if (pIpAdapterInfo)
	{
		delete pIpAdapterInfo;
	}
	return 0;
}