Windows C++获取网卡适配器接口信息

2023-05-16

Windows C++获取网卡适配器接口信息
#include <pcap.h>
#ifdef _MSC_VER
#include <WinSock2.h>
#include <Iphlpapi.h>
#pragma comment(lib,"Iphlpapi.lib") //需要添加Iphlpapi.lib库
#endif

std::vector<std::string> getLocalMachineNetworkAdapterList()
{
	pcap_if_t *alldevs;
	pcap_if_t *d;
	int i = 0;
	pcap_addr_t *a;
	char errbuf[PCAP_ERRBUF_SIZE];
	std::vector<std::string> vecAdapter;
	/* 获取设备列表 */
	if (pcap_findalldevs(&alldevs, errbuf) == -1)
	{
		return vecAdapter;
	}
	/* 数据列表 */
	for (d = alldevs; d; d = d->next)
	{
		//cout << d->name << " " << d->description << "\n";
		++i;
		if (d->description)
			/*printf(" (%s)", d->description)*/;
		else
			/*printf(" (No description available)\n")*/;

		for (a = d->addresses; a; a = a->next)
		{
			if (!isAddressUnspecified(boost::asio::ip::address::from_string(inet_ntoa(((struct sockaddr_in *)a->addr)->sin_addr))))
			{
				//printf("%s", inet_ntoa(((struct sockaddr_in *)a->addr)->sin_addr));
				vecAdapter.push_back(std::string(d->description) + std::string(" ") + std::string(inet_ntoa(((struct sockaddr_in *)a->addr)->sin_addr)));
				//printf("bug:%s", vecAdapter.back().c_str());
			}
			else
			{
				vecAdapter.push_back(std::string(d->description) + std::string(" ") + std::string("X.X.X.X"));
			}
		}
	}
	if (i == 0)
	{
		printlog("\ngetLocalMachineNetworkAdapterList:No NetWork interfaces found! Make sure WinPcap is installed.");
		return vecAdapter;
	}
	/* 我们已经不需要设备列表了, 释放它 */
	pcap_freealldevs(alldevs);
	return vecAdapter;
}


std::vector<std::string> getLocalMachineNetworkAdapterDspnameList()
{
	std::vector<std::string> names;
#ifdef _MSC_VER
	//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)
		{
			names.push_back(std::string(pIpAdapterInfo->Description) + std::string(":") + std::string(pIpAdapterInfo->AdapterName));
			pIpAdapterInfo = pIpAdapterInfo->Next;
			//cout << "网卡名称:" << pIpAdapterInfo->AdapterName << endl;
			//cout << "网卡描述:" << pIpAdapterInfo->Description << endl;
		}
	}
	//释放内存空间
	if (pIpAdapterInfo)
	{
		delete pIpAdapterInfo;
	}
#endif
	return names;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Windows C++获取网卡适配器接口信息 的相关文章

随机推荐