使用windows API获取本地主机的MAC地址

来源:互联网 发布:windows 10 mobile qq 编辑:程序博客网 时间:2024/05/17 00:55

本地网卡的MAC地址可以通过ARP协议获得,也可以通过API查询获得,IP Helper API中还有一组管理网络适配器的API,其中有一个可以获得网卡相关信息。

DWOED GetAdaptersInfo(

PIP_ADAPTER_INFO pAdapterInfo;

PULONG pOutBufLen;

);

两个参数分别是:存储网卡信息的缓冲区指针和缓冲区大小。

// GetAdapterInfo.cpp : 定义控制台应用程序的入口点。
//


#include "stdafx.h"
#include<Winsock2.h>
#include <Windows.h>
#include<Iphlpapi.h>
#include<iostream>
#include<tchar.h>
#include<conio.h>
#pragma comment (lib, "Iphlpapi.lib")
#pragma comment (lib, "Ws2_32")


int _tmain(int argc, _TCHAR* argv[])
{
PIP_ADAPTER_INFO ipAdapterInfo;
PIP_ADAPTER_INFO ipAdapter = NULL;
DWORD dwRetval = 0;
ULONG ulOutBuffer = sizeof(IP_ADAPTER_INFO);
ipAdapterInfo = (IP_ADAPTER_INFO*)malloc(sizeof(IP_ADAPTER_INFO));
dwRetval = GetAdaptersInfo(ipAdapterInfo, &ulOutBuffer);
if (dwRetval == ERROR_BUFFER_OVERFLOW)
{
free(ipAdapterInfo);
ipAdapterInfo = (IP_ADAPTER_INFO*)malloc(ulOutBuffer);
dwRetval = GetAdaptersInfo(ipAdapterInfo, &ulOutBuffer);
}
if (dwRetval == NO_ERROR)
{
ipAdapter = ipAdapterInfo;
while (ipAdapter)
{
printf("Adapter_name: %s\n", ipAdapter->AdapterName);
printf("Adapter_desc: %s\n", ipAdapter->Description);
printf("Adapter_macAddress: %02X %02X %02X %02X %02X %02X %02X %02X\n",
ipAdapter->Address[0], ipAdapter->Address[1],
ipAdapter->Address[2], ipAdapter->Address[3],
ipAdapter->Address[4], ipAdapter->Address[5]);
printf("IP_Address: %s\n", ipAdapter->IpAddressList.IpAddress.String);
printf("IP Mask: %s\n", ipAdapter->IpAddressList.IpMask.String);
printf("Getway: %s\n", ipAdapter->GatewayList.IpAddress.String);
if (ipAdapter->DhcpEnabled)
{
printf("DHCP_Enable:  yes\n");
printf("DHCP_Server: %s\n", ipAdapter->DhcpServer);
printf("Lease obtained: %d\n", ipAdapter->LeaseObtained);
}
if (ipAdapter->HaveWins)
{
printf("Have_Wins: yes\n");
printf("Primery_Wins: %s\n", ipAdapter->PrimaryWinsServer);
printf("Seconde_Wins: %s\n", ipAdapter->SecondaryWinsServer);
}
else
{
printf("Have Wins: No!");
}
ipAdapter = ipAdapter->Next;
}
}
getch();
}

//一些相关的知识:

IP_ADAPTER_INFO结构体:

typedef struct _IP_ADAPTER_INFO {
  struct _IP_ADAPTER_INFO* Next; //指向链表中下一个PIP_ADAPTER_INFO信息
  DWORD ComboIndex; //预留值
  char AdapterName[MAX_ADAPTER_NAME_LENGTH + 4];//用ANSI字符表达的适配器名称
  char Description[MAX_ADAPTER_DESCRIPTION_LENGTH + 4]; //用ANSI字符表达的适配器描述
  UINT AddressLength;//适配器硬件地址以字节计算的长度
  BYTE Address[MAX_ADAPTER_ADDRESS_LENGTH]; //硬件地址以BYTE数组表示
  DWORD Index; //适配器索引
  UINT Type; //适配器类型
  UINT DhcpEnabled;//适配器是否开DHCP
  PIP_ADDR_STRING CurrentIpAddress;//预留值
  IP_ADDR_STRING IpAddressList;//该适配器的IPV4地址列表
  IP_ADDR_STRING GatewayList;//该适配器的IPV4网关地址列表
  IP_ADDR_STRING DhcpServer;//该适配器的DHCP服务器的IPV4列表
  BOOL HaveWins; //是否有WINS服务器
  IP_ADDR_STRING PrimaryWinsServer;//主WINS服务器
  IP_ADDR_STRING SecondaryWinsServer;//第二WINS服务器
  time_t LeaseObtained;//服务器规定IP地址使用期限,此为地址租用开始时间
  time_t LeaseExpires; //地址租约到期时间
} IP_ADAPTER_INFO, *PIP_ADAPTER_INFO

0 0
原创粉丝点击