Windows获取本机MAC地址方法(C语言)
Windows获取本机MAC地址方法(C语言)
用到的方法有两种:Netbios()和GetAdaptersInfo();
Netbios
获取步骤主要分为三步:
一、枚举本机所有LAN
二、重设每个LANA(初始化所有LANA)
三、获取网卡信息(填充数据结构)
如果只有单网卡的情况下,第一步可以不用有,但是在第三步之前一定要对所有的LANA进行重设即初始化。
实例代码如下:
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>#pragma comment(lib, "NetAPI32.Lib")typedef struct _ASTAT_
{ADAPTER_STATUS adapt; //包含一个网络适配器的信息NAME_BUFFER NameBuff [30];
}ASTAT, * PASTAT; //定义一个网卡的结构体//解释并执行指定的网络控制块(NCB)
int main (void)
{NCB ncb; //网络控制块ASTAT Adapter; //包含MAC地址的数据结构LANA_ENUM lana_enum; //包含当前LAN适配器的数量UCHAR uRetCode; //返回结果码//UCHAR *mac={};//用Netbios()获取网卡信息(MAC\IP\网关…)的基本步骤://一、枚举本机所有LAN//二、重设每个LANA(初始化所有LANA)//三、获取网卡信息(填充数据结构)//一、NCBENUM:枚举LAN适配器(LANA)号码memset(&ncb, 0, sizeof(ncb)); memset(&lana_enum, 0, sizeof(lana_enum)); ncb.ncb_command = NCBENUM; //统计系统中网卡的数量 指定指令为NCBENUM,用于获取网卡的数量及编号 向网卡发送NCBENUM命令,以获取当前机器的网卡信息,如有多少个网卡,每个网卡的编号(MAC地址)ncb.ncb_buffer = (unsigned char *)&lana_enum; ncb.ncb_length = sizeof(LANA_ENUM); uRetCode = Netbios(&ncb); if(uRetCode != NRC_GOODRET)exit(-1);//二、NCBREST:重置LAN适配器for(int lana=0; lana<lana_enum.length; lana++) { ncb.ncb_command = NCBRESET; //初始化逻辑网卡命令ncb.ncb_lana_num = lana_enum.lana[lana]; uRetCode = Netbios(&ncb); if(uRetCode == NRC_GOODRET) break; } //三、NCBASTAT:检索本地或远程适配器的状态(lan_enum.lana[0]默认为本地PC的MAC)memset(&ncb, 0, sizeof(ncb)); ncb.ncb_command = NCBASTAT; //对逻辑网卡统计信息命令ncb.ncb_lana_num = lana_enum.lana[0]; //这里只获取了一个网卡的信息,如果要获取全部网卡的信息,可以把这一部分放入上面的循环语句中strcpy((char*)ncb.ncb_callname, "*"); ncb.ncb_buffer = (unsigned char *)&Adapter; //绑定数据结构ncb 和 Adapter:填充Adapterncb.ncb_length = sizeof(Adapter); uRetCode = Netbios(&ncb);if(uRetCode != NRC_GOODRET)exit(-1);printf("MAC:%02X-%02X-%02X-%02X-%02X-%02X\n", Adapter.adapt.adapter_address[0], Adapter.adapt.adapter_address[1], Adapter.adapt.adapter_address[2], Adapter.adapt.adapter_address[3], Adapter.adapt.adapter_address[4], Adapter.adapt.adapter_address[5]);
}
GetAdaptrsInfo
GetAdaptersInfo的使用更简单,但是也存在系统兼容性问题,如果想要更稳定,建议使用GetAdaptersAddresses。下面程序中非常的简单,但是只针对单张网卡进行了设计,有多张网卡的时候就要进行区分了。
#pragma comment(lib,"Iphlpapi.lib")
#include <atlbase.h>
//#include <atlconv.h>
#include <iphlpapi.h> int main()
{ DWORD dwRetVal = 0; IP_ADAPTER_INFO adapterInfo ={0}; //存放网卡信息的数据结构IP_ADAPTER_INFO *pAdapter = NULL; //指向该结构的指针ULONG ulOutBufLen = sizeof(adapterInfo); dwRetVal = GetAdaptersInfo(&adapterInfo, &ulOutBufLen); //获取网卡信息if(dwRetVal == ERROR_SUCCESS) { pAdapter = &adapterInfo; //printf("AdapterName:%s\n",pAdapter->AdapterName); //printf("AdapterDesc:%s\n",pAdapter->Description); printf("AdapterAddr:"); //MAC地址for(UINT i=0;i<pAdapter->AddressLength;i++) { printf("%02X%c", pAdapter->Address[i], i == pAdapter->AddressLength-1 ? '\n' : '-'); } printf("AdapterType:%d\n",pAdapter->Type); //6是以太网网卡接口的意思// printf("IPAddress:%s\n",pAdapter->IpAddressList.IpAddress.String); // printf("IPMask:%s\n",pAdapter->IpAddressList.IpMask.String); } else if(ERROR_BUFFER_OVERFLOW == dwRetVal)//有多张网卡的时候出现的情况printf("ERROR_BUFFER_OVERFLOW\n ");else { printf("GetAdaptersInfo() failed."); //printf("error:%d\n",dwRetVal);} return 0;
}
一台机器上可能不止有一个网卡,但每一个网卡只有一个MAC地址,而每一个网卡可能配置有多个IP地址;如平常的笔记本电脑中,就会有无线网卡和有线网卡(网线接口)两种;因此,如果要获得本机所有网卡的IP和MAC地址信息,则必须顺序获得每个网卡,再依次获取其信息等;在windows sdk中,用IP_ADAPTER_INFO结构体存储网卡信息,包括网卡名、网卡描述、网卡MAC地址、网卡IP等,该结构体的主要描述如下所示:
typedef struct _IP_ADAPTER_INFO {struct _IP_ADAPTER_INFO* Next;//指向链表中下一个适配器信息的指针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;//适配器类型,主要有以下几种:/** MIB_IF_TYPE_OTHER 1* MIB_IF_TYPE_ETHERNET 6* MIB_IF_TYPE_TOKENRING 9* MIB_IF_TYPE_FDDI 15* MIB_IF_TYPE_PPP 23* MIB_IF_TYPE_LOOPBACK 24* MIB_IF_TYPE_SLIP 28*/UINT DhcpEnabled;//指定这个适配器是否开启DHCPPIP_ADDR_STRING CurrentIpAddress;//预留值IP_ADDR_STRING IpAddressList;//该适配器的IPv4地址链表IP_ADDR_STRING GatewayList;//该适配器的网关IPv4地址链表IP_ADDR_STRING DhcpServer;//该适配器的DHCP服务器的IPv4 地址链表BOOL HaveWins;IP_ADDR_STRING PrimaryWinsServer;IP_ADDR_STRING SecondaryWinsServer;time_t LeaseObtained;time_t LeaseExpires;} IP_ADAPTER_INFO,*PIP_ADAPTER_INFO;
Windows获取本机MAC地址方法(C语言)相关推荐
- android 获取网卡mac_Android获取本机Mac地址及IP地址方法
1.Android 获取本机Mac 地址方法: 需要在AndroidManifest.xml文件中添加权限: public String getLocalMacAddress() { WifiMan ...
- Unity——获取本机MAC地址
Unity中获取本机Mac地址,常用于类似绑定设备的加密情况中,限制程序只可以在固定的设备上使用.首先我们需要在脚本中引用System.Net.NetworkInformation程序集,然后使用Ne ...
- centos7 shell 获取ip_Linux Shell脚本中获取本机ip地址方法
方法一:ifconfig -a ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr -d "a ...
- js获取本机mac地址,IP地址
<!DOCTYPE HTML> <html> <head> <title>js获取本机mac地址,IP地址,计算机名</title> ...
- golang网络编程:获取本机MAC地址
对于IP地址可以表示一个网络连接,但是无法唯一标识一台主机,而MAC地址是主机网卡的物理地址,这个对于一台主机来说是不会改变的. func mac(){// 获取本机的MAC地址interfaces, ...
- python --获取本机mac地址/本机IP
本机mac地址 import uuid import jsondef mac():_mac = uuid.UUID(int=uuid.getnode()).hex[-12:]return json.d ...
- 批处理文件获取本机mac地址与ip地址
桌面新建txt文件,将代码复制后另存为bat文件,另存为时编码改为ANSI: @echo off & setlocal enabledelayedexpansion echo =------- ...
- c语言获得本机mac地址,VC实现获取本机MAC地址的方法
本文实例采用vc6.0运行环境,通过实例实现获得MAC地址的功能. 完整的实例代码如下: #include "stdafx.h" #include #include #includ ...
- Node.js 获取本机Mac地址
方案一:使用getmac库 首先我们要先加载一个包用于获取mac地址 npm install getmac 安装完毕会在node_modules文件夹下发现一个getmac文件夹,进入到node_mo ...
最新文章
- springboot 多线程_SpringBoot异步调用@Async
- 损失函数约束类间不一致性
- linux手动安装unzip_centos下离线安装zip和unzip
- jQueryEasyUi验证
- 安卓手机的a/span的宽高失效
- Linux学习:Linux基础命令集(2)
- PHP笔记-文件上传例子
- 实用网址(平时记下的)
- java swing 窗口事件_Javaswing多类窗口怎么写按钮事件呢?
- 问题十五:C++中抽象类,虚函数是什么鬼?怎么测试
- 思科被发现使用华为代码,解释:忘了删
- python实现超市商品销售管理系统_python实现超市商品销售管理系统
- 分数加减法—两个分数的加减法
- python画椭圆形_如何绘制Python中的半椭圆?
- 各地前端工资是多少?三线城市的前端有多少
- ffmpeg GPU加速压制视频
- Python通过蒙特卡罗法计算π值
- 大龄程序猿的新出路:改行学中医!40岁程序员,重新高考学中医,如今混得还不错!...
- 山东建筑大学计算机学院孙倩,山东建筑大学毕业设计答辩.pdf
- SSL证书申购指南教程