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 地址?