windows下获取IP和MAC地址

Posted qianbo_insist

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了windows下获取IP和MAC地址相关的知识,希望对你有一定的参考价值。

1、定义数据结构

//一个网卡可能有多个IP地址
typedef struct s_ip_fname
{
	std::vector<std::string> ips;
	std::string mac;
}s_ip_fname;

使用std::vector<s_ip_fname> 去获取更多的网卡和ip,一个系统里面可能有多个网卡,一个网卡可以有多个ip地址,这个必须了解。

2、获取mac的方法

GetAdaptersInfo API可以获取多块接口卡的信息
以下是代码:

#include <string>
#include <vector>
#ifdef _WIN32
#include <WinSock2.h>
#include <Iphlpapi.h>
using namespace std;
#pragma comment(lib,"Iphlpapi.lib") //需要添加Iphlpapi.lib库
#endif
typedef struct s_ip_fname
{
	std::vector<std::string> ips;
	std::string mac;
}s_ip_fname;
static int get_ipfname(std::vector<s_ip_fname> &ff)
{
#define ADDR(x) pIpAdapterInfo->Address[x]
	PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO();
	unsigned long stSize = sizeof(IP_ADAPTER_INFO);
	int nRel = GetAdaptersInfo(pIpAdapterInfo, &stSize);
	DWORD netCardNum = 0;
	GetNumberOfInterfaces(&netCardNum);
	int IPnumPerNetCard = 0;
	if (ERROR_BUFFER_OVERFLOW == nRel)
	{
		delete pIpAdapterInfo;
		pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize];
		nRel = GetAdaptersInfo(pIpAdapterInfo, &stSize);
		return -1;
	}
	if (ERROR_SUCCESS == nRel)
	{
		//maybe we have >1 network card
		while (pIpAdapterInfo)
		{
			s_ip_fname ipf;
			switch (pIpAdapterInfo->Type)
			{
			case MIB_IF_TYPE_OTHER:
				//cout << "OTHER" << endl; 
				break;
			case MIB_IF_TYPE_ETHERNET:
				//cout << "ETHERNET" << endl; 
				break;
			case MIB_IF_TYPE_TOKENRING:
				//cout << "TOKENRING" << endl; 
				break;
			case MIB_IF_TYPE_FDDI:
				//cout << "FDDI" << endl; 
				break;
			case MIB_IF_TYPE_PPP:
				//cout << "PPP" << endl; 
				break;
			case MIB_IF_TYPE_LOOPBACK:
				//cout << "LOOPBACK" << endl; 
				break;
			case MIB_IF_TYPE_SLIP:
				//cout << "SLIP" << endl; 
				break;
			default:
				//cout << "" << endl; 
				break;
			}
			char buffer[128];
			sprintf(buffer, "%02X%02X%02X%02X%02X%02X%02X%02X",
				//sprintf(buffer, "%02X-%02X-%02X-%02X-%02X-%02X-%02X-%02X",
				ADDR(0), ADDR(1), ADDR(2), ADDR(3), ADDR(4), ADDR(5), ADDR(6), ADDR(7));
			ipf.mac = buffer;
			IPnumPerNetCard = 0;
			//可能网卡有多IP
			IP_ADDR_STRING *pIpAddrString = &(pIpAdapterInfo->IpAddressList);
			do
			{
				ipf.ips.push_back(pIpAddrString->IpAddress.String);
				pIpAddrString = pIpAddrString->Next;

			} while (pIpAddrString);
			ff.push_back(ipf);
			pIpAdapterInfo = pIpAdapterInfo->Next;
		}
	}
	//释放内存空间
	if (pIpAdapterInfo)
	{
		delete pIpAdapterInfo;
	}
	return 0;
}

以上是关于windows下获取IP和MAC地址的主要内容,如果未能解决你的问题,请参考以下文章

VB编写的获取网卡MAC和IP程序在没安装VB的电脑上运行出现429错误.如何解决

windows server2003如何临时修改MAC地址?

#yyds干货盘点# 如何优雅的获取 Mac OS 系统 IP 地址?

java工具类,在Windows,Linux系统获取电脑的MAC地址本地IP电脑名

怎么绑定IP和MAC地址

IP地址利用ARP协议获取MAC地址进行数据包的传送