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语言)相关推荐

  1. android 获取网卡mac_Android获取本机Mac地址及IP地址方法

    1.Android  获取本机Mac 地址方法: 需要在AndroidManifest.xml文件中添加权限: public String getLocalMacAddress() { WifiMan ...

  2. Unity——获取本机MAC地址

    Unity中获取本机Mac地址,常用于类似绑定设备的加密情况中,限制程序只可以在固定的设备上使用.首先我们需要在脚本中引用System.Net.NetworkInformation程序集,然后使用Ne ...

  3. 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 ...

  4. js获取本机mac地址,IP地址

    <!DOCTYPE HTML> <html> <head>     <title>js获取本机mac地址,IP地址,计算机名</title> ...

  5. golang网络编程:获取本机MAC地址

    对于IP地址可以表示一个网络连接,但是无法唯一标识一台主机,而MAC地址是主机网卡的物理地址,这个对于一台主机来说是不会改变的. func mac(){// 获取本机的MAC地址interfaces, ...

  6. python --获取本机mac地址/本机IP

    本机mac地址 import uuid import jsondef mac():_mac = uuid.UUID(int=uuid.getnode()).hex[-12:]return json.d ...

  7. 批处理文件获取本机mac地址与ip地址

    桌面新建txt文件,将代码复制后另存为bat文件,另存为时编码改为ANSI: @echo off & setlocal enabledelayedexpansion echo =------- ...

  8. c语言获得本机mac地址,VC实现获取本机MAC地址的方法

    本文实例采用vc6.0运行环境,通过实例实现获得MAC地址的功能. 完整的实例代码如下: #include "stdafx.h" #include #include #includ ...

  9. Node.js 获取本机Mac地址

    方案一:使用getmac库 首先我们要先加载一个包用于获取mac地址 npm install getmac 安装完毕会在node_modules文件夹下发现一个getmac文件夹,进入到node_mo ...

最新文章

  1. springboot 多线程_SpringBoot异步调用@Async
  2. 损失函数约束类间不一致性
  3. linux手动安装unzip_centos下离线安装zip和unzip
  4. jQueryEasyUi验证
  5. 安卓手机的a/span的宽高失效
  6. Linux学习:Linux基础命令集(2)
  7. PHP笔记-文件上传例子
  8. 实用网址(平时记下的)
  9. java swing 窗口事件_Javaswing多类窗口怎么写按钮事件呢?
  10. 问题十五:C++中抽象类,虚函数是什么鬼?怎么测试
  11. 思科被发现使用华为代码,解释:忘了删
  12. python实现超市商品销售管理系统_python实现超市商品销售管理系统
  13. 分数加减法—两个分数的加减法
  14. python画椭圆形_如何绘制Python中的半椭圆?
  15. 各地前端工资是多少?三线城市的前端有多少
  16. ffmpeg GPU加速压制视频
  17. Python通过蒙特卡罗法计算π值
  18. 大龄程序猿的新出路:改行学中医!40岁程序员,重新高考学中医,如今混得还不错!...
  19. 山东建筑大学计算机学院孙倩,山东建筑大学毕业设计答辩.pdf
  20. SSL证书申购指南教程

热门文章

  1. bilibili视频信息爬虫
  2. clang-llvm跨平台编译
  3. 全程分享投资千万的MOBA竞技游戏-创意\架构\制作……
  4. mysql 伪表查询语句_MySQL数据库之select查询语句
  5. 什么是专利申请,专利申请的好处
  6. MySQL之Join分析
  7. 超简单的Jmeter连接mysql数据库,3分钟搞定!
  8. php生成字母头像,php 按照中文字母名字排序,并把相应的头像显示出来
  9. 关于军棋自动裁判机制的设想
  10. 实现《黑客帝国》字符雨 html 代码