Windows下获取本机MAC地址的方法
2011-12-05 16:34
609 查看
本文 来自:http://hi.baidu.com/baibaiwei/blog/item/2712a8012e1348021d9583cf.html。
摘要:本文提供了在Windows操作系统下,获取本机MAC地址的三种方法。 我们在编写网络相关的程序时,经常会遇到需要获取本机MAC地址的问题。如何获取本机的MAC地址?在Windows操作系统下,用户可能马上会想到用ipconfig/all命令,但如果需要在程序中获得怎么办?本文给出了几种简单、常用的方法。 1[b]. 利用UUID获取[/b] 在Windows操作系统下,以Client-Sever模式进行通信时,运行时间库为了区分每个接口,需要为个接口建立一个UUID(Universally Unique Identifiers),在Windows95/98版本下,UUID的创建是通过调用函数UuidCreate()完成的,其中的第2至8字节包含了用户的MAC地址。因此,一种比较快的获取MAC地址的方法是创建一个UUID,然后分析UUID结构的第2至8字节,既可获取本机的MAC地址。示例程序如下: [align=left]static void GetMACaddress(void)[/align] [align=left]{[/align] [align=left]unsigned char MACData[6];[/align] [align=left][/align] [align=left]UUID uuid;[/align] [align=left]UuidCreate( &uuid ); // 要求操作系统创建一个新的UUID[/align] [align=left][/align] [align=left]for (int i=2; i<8; i++) // 获取本机MAC地址[/align] [align=left] MACData[i - 2] = uuid.Data4[i];[/align] [align=left][/align] [align=left]PrintMACaddress(MACData); [/align] [align=left]}[/align] [align=left][/align] [align=left]void PrintMACaddress(unsigned char MACData[])[/align] [align=left]{[/align] [align=left] printf("MAC Address: %02X-%02X-%02X-%02X-%02X-%02X\n",[/align] [align=left] MACData[0], MACData[1], MACData[2], MACData[3], MACData[4], MACData[5]);[/align] [align=left]}[/align] [align=left]这种方法只能用于Windows95/98操作系统。因为从安全的角度来看,在网络上散布本机的MAC地址存在着安全隐患,因此在Windows2000/xp操作系统中,微软对函数UuidCreate()进行了修正,使之在生成UUID时,不借助于本机的MAC地址。原来UuidCreate()完成的功能由函数UuidCreateSequential()完成。因此,如果在新的系统中采用这种方法,可用UuidCreateSequential()代替上述程序中的UuidCreate()函数。[/align] [align=left] 另外,需要说明的是,这种方式只能用于单网卡主机。[/align] 2. 利用Net Bios协议获取 这种方法在Windows 95/98/Me/NT/2000/XP下都适用,不过它要求网卡必须安装正确,绑定了NetBios协议,并且机器正联接在一个运行正常的NetBios网络上。如果主机未接在网上,即使用网卡运行正常,运行下述代码,用户也不会得到任何信息。 [align=left]static void GetMACaddress(void)[/align] [align=left]{[/align] [align=left]unsigned char MAC Data[8]; // 定义存放 MAC地址的缓冲区 (至少6字节)[/align] [align=left][/align] [align=left]WKSTA_TRANSPORT_INFO_0 *pwkti;[/align] [align=left]DWORD dwEntriesRead;[/align] [align=left]DWORD dwTotalEntries;[/align] [align=left]BYTE *pbBuffer;[/align] [align=left] [/align] [align=left]// 通过 NetBIOS的枚举函数获取MAC地址[/align] [align=left]NET_API_STATUS dwStatus = NetWkstaTransportEnum([/align] [align=left] NULL, // [input] 服务器名,0指本机[/align] [align=left] 0, // [input] 0指函数返回指向WKSTA_TRANSPORT_INFO_0结构的指针[/align] [align=left] &pbBuffer, // [output] 指向缓冲区指针[/align] [align=left] MAX_PREFERRED_LENGTH, // [input] 缓冲区最大长度[/align] [align=left] &dwEntriesRead, // [output] 用于记录实际元素个数[/align] [align=left] &dwTotalEntries, //[/align] [align=left] NULL); //[input/output] 恢复句柄[/align] [align=left]assert(dwStatus == NERR_Success);[/align] [align=left][/align] [align=left]pwkti = (WKSTA_TRANSPORT_INFO_0 *)pbBuffer; // 指针类型转换[/align] [align=left][/align] [align=left]for(DWORD i=0; i< dwEntriesRead; i++)[/align] { // 读取并打印MAC地址 [align=left] swscanf((wchar_t *)pwkti[i].wkti0_transport_address,[/align] [align=left] L"%2hx%2hx%2hx%2hx%2hx%2hx",[/align] [align=left] &MACData[0],[/align] [align=left] &MACData[1],[/align] [align=left] &MACData[2],[/align] [align=left] &MACData[3],[/align] [align=left] &MACData[4],[/align] [align=left] &MACData[5]);[/align] [align=left] PrintMACaddress(MACData);[/align] [align=left]}[/align] [align=left][/align] [align=left]// 释放缓冲区[/align] [align=left]dwStatus = NetApiBufferFree(pbBuffer);[/align] [align=left]assert(dwStatus == NERR_Success);[/align] [align=left]}[/align] [align=left][/align] 3. 利用GetAdaptersInfo()函数获取 此方法利用了Windows SDK 中的函数GetAdaptersInfo(),对于用户来讲,编程很简单,而且适用于Windows 95/98/Me/NT/XP等操作系统,并且不要求主机必须接在网络上,要求的只有一点,就是网卡在Windows下必须是可用的。同时,需要说明的是,GetAdaptersInfo()是一个功能非常强大的函数,它不但可以得到本机的MAC地址,而且可以得到许多其它相关信息。详细内容可参见MSDN中有关IP_ADAPTER_INFO结构的说明。 bool GetMACaddress(char* pMac) { IP_ADAPTER_INFO AdapterInfo[16]; // 定义网卡信息存储区。 DWORD dwBufLen = sizeof(AdapterInfo); DWORD dwStatus = GetAdaptersInfo( AdapterInfo, // [output] 指向接收数据缓冲指针 &dwBufLen); // [input] 缓冲区大小 if(dwStatus == ERROR_SUCCESS) // 此处是个trap,用来保证返回值有效 { PIP_ADAPTER_INFO pAdapterInfo = AdapterInfo; if(pAdapterInfo != NULL) { sprintf(pMac,"%02X-%02X-%02X-%02X-%02X-%02X", pAdapterInfo->Address[0], pAdapterInfo->Address[1], pAdapterInfo->Address[2], pAdapterInfo->Address[3], pAdapterInfo->Address[4], pAdapterInfo->Address[5]); return true; } else return false; } else return false; } 本程序中定义了一个长度为16的IP_ADAPTER_INFO结构类型的数组,因此用户主机安装的网卡数不能超过16块,这在一般情况下都是可以满足的,如果出现超过16块的情况,用户需修改此项设置,或采用动态申请存贮空间的方式解决。 4.结束语 以上三种方法均在Visual C++ 6.0、Windows2000 环境下编译通过并工作正常。需要说明的是,示例程序只是提供了一种解决问题的思路,从软件工程的角度来看,有些不尽人意的地方,读者可以根据自己的编程需要进行修改。 5,获取IP void CheckIP(void) { WSADATA wsaData; char name[155]; char *ip; PHOSTENT hostinfo; if ( WSAStartup( MAKEWORD(2,0), &wsaData ) == 0 ) { if( gethostname ( name, sizeof(name)) == 0) { if((hostinfo = gethostbyname(name)) != NULL) { //这些就是获得IP的函数 ip = inet_ntoa (*(struct in_addr *)*hostinfo->h_addr_list); printf("%s\n",ip); } } WSACleanup( ); } } |
相关文章推荐
- Windows中获取本机MAC地址的方法
- windows下获取MAC地址的三种方法
- windows及Linux系统下获取IP及MAC地址的方法
- Android下获取以太网mac地址方法 非wifi
- PHP获取网卡MAC地址的方法
- PHP获取网卡MAC地址的方法
- java(jdk1.4、jdk1.6)获取mac地址的方法(winxp、win2003、win7、linux)
- 利用windows内置的控件获取客户端网卡MAC地址
- windows系统获取mac地址命令
- Android机用移动数据流量获取也能获取mac地址的终极方法。(第二种方法)
- VC获取MAC地址的4种方法
- ASP.NET获取IP与MAC地址的方法
- C++获取本机MAC,IP,MASK地址的方法
- 获取系统网络MAC地址的三种方法
- 获取 android 设备 mac 地址的方法
- wince下获取mac地址的简单方法!
- 网卡MAC地址相关信息大全-2 获取网卡MAC的3个方法
- C语言实现Windows下获取IP和MAC地址。