获取MAC地址使用函数DWORD GetAdaptersInfo(PIP_ADAPTER_INFO pAdapterInfo, PULONG pOutBufLen);
PULONG pOutBufLen;指定IP_ADAPTER_INFO结构大小,如果大小不够,返回所需大小,这个参数既是输入参数也是输出参数。
PIP_ADAPTER_INFO为IP_ADAPTER_INFO结构的指针。
下面是这个结构用到的成员变量:
typedef struct _IP_ADAPTER_INFO
{
struct _IP_ADAPTER_INFO *Next;//指向适配器列表中的下一个适配器
char AdapterName[MAX_ADAPTER_NAME_LENGTH + 4];//适配器名称
char Description[MAX_ADAPTER_DESCRIPTION_LENGTH + 4];//适配器的描述
UINT Type;//适配器类型
UINT AddressLength;//MAC地址长度
BYTE Address[MAX_ADAPTER_ADDRESS_LENGTH];//MAC地址
IP_ADDR_STRING IpAddressList;//与此适配器相关的IP地址列表
IP_ADDR_STRING GatewayList;//网关地址列表
}IP_ADAPTER_INFO, *PIP_ADAPTER_INFO;
#include <windows.h>
#include <stdio.h>
#include "iphelper\Iphlpapi.h"
#pragma comment(lib,"iphelper\\IPHLPAPI.LIB")
int main()
{
PIP_ADAPTER_INFO pAdapterInfo = NULL;
//分配内存大小
unsigned long ulLen = 0;
//网卡数量
int NetCardNum = 0;
GetAdaptersInfo(pAdapterInfo, &ulLen);
pAdapterInfo = (PIP_ADAPTER_INFO)GlobalAlloc(GPTR, ulLen);
if (GetAdaptersInfo(pAdapterInfo, &ulLen) == ERROR_SUCCESS)
{
while (pAdapterInfo)
{
printf("第%d个网卡:\n", ++NetCardNum);
printf("网卡名称:%s \n", pAdapterInfo->AdapterName);
printf("网卡描述:%s \n", pAdapterInfo->Description);
switch (pAdapterInfo->Type)
{
case MIB_IF_TYPE_OTHER:
printf("网卡类型:OTHER \n");
break;
case MIB_IF_TYPE_ETHERNET:
printf("网卡类型:ETHERNET \n");
break;
case MIB_IF_TYPE_TOKENRING:
printf("网卡类型:TOKENRING \n");
break;
case MIB_IF_TYPE_FDDI:
printf("网卡类型:FDDI \n");
break;
case MIB_IF_TYPE_PPP:
printf("网卡类型:PPP \n");
break;
case MIB_IF_TYPE_LOOPBACK:
printf("网卡类型:LOOPBACK \n");
break;
case MIB_IF_TYPE_SLIP:
printf("网卡类型:SLIP \n");
break;
default:
break;
}
printf("网卡MAC地址: \n");
for (DWORD i = 0; i < pAdapterInfo->AddressLength; i++)
{
if (i < pAdapterInfo->AddressLength - 1)
printf("%02X-",pAdapterInfo->Address[i]);
else
printf("%02X \n",pAdapterInfo->Address[i]);
}
printf("网卡IP地址: \n");
IP_ADDR_STRING IpAddrString = pAdapterInfo->IpAddressList;
printf("IP地址:%s \n", IpAddrString.IpAddress.String);
printf("子网地址:%s \n", IpAddrString.IpMask.String);
printf("网关地址:%s \n", pAdapterInfo->GatewayList.IpAddress.String);
pAdapterInfo = pAdapterInfo->Next;
printf("\n\n");
}
}
if (pAdapterInfo)
GlobalFree(pAdapterInfo);
return 0;
}
要取得网络中其他主机的MAC地址,可以使用SendARP函数向目标主机发送ARP请求封包,返回目的IP地址对应的MAC地址。书上说第九章讨论SendARP的使用,期待一下。
(2) 的主要内容就是使用函数得到本机的MAC地址,同时是Iphlpapi文件的使用。