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

该代码示例展示了如何在Windows环境下使用C++获取本地机器的网络适配器列表和描述名。通过`pcap`库获取设备列表,并结合`Iphlpapi`库获取详细接口信息,包括IP地址。函数`getLocalMachineNetworkAdapterList`返回适配器描述和IP,而`getLocalMachineNetworkAdapterDspnameList`返回适配器描述和设备名。
摘要由CSDN通过智能技术生成
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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值