第二章 Winsock编程接口(2)

获取MAC地址使用函数DWORD GetAdaptersInfo(PIP_ADAPTER_INFO pAdapterInfo, PULONG pOutBufLen);

PULONG pOutBufLen;指定IP_ADAPTER_INFO结构大小,如果大小不够,返回所需大小,这个参数既是输入参数也是输出参数。

PIP_ADAPTER_INFOIP_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 
#include 
#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;
}


需要Iphlpapi头文件和链接库文件,文件已经上传了。或者自己去网上找一下。


要取得网络中其他主机的MAC地址,可以使用SendARP函数向目标主机发送ARP请求封包,返回目的IP地址对应的MAC地址。书上说第九章讨论SendARP的使用,期待一下。


(2) 的主要内容就是使用函数得到本机的MAC地址,同时是Iphlpapi文件的使用。

你可能感兴趣的:(第二章 Winsock编程接口(2))