VC MFC 获取 IP地址和MAC地址程序

照抄这个的

VC获取IP地址和MAC地址程序(转载)

  1 #include <winsock2.h> //该头文件定义了Socket编程的功能
  2 #include <stdio.h>    //该头文件声明了输入输出流函数
  3 #include <stdlib.h>   //该头文件定义了一些通用函数
  4 #include <httpext.h>   //该头文件支持HTTP请求
  5 #include <windef.h>   //该头文件定义了Windows的所有数据基本型态
  6 #include <Nb30.h>   //该头文件声明了netbios的所有的函数 
  7 #pragma comment(lib,"ws2_32.lib")    //连接ws2_32.lib库.只要程序中用到Winsock API 函数,都要用到 Ws2_32.lib
  8 #pragma comment(lib,"netapi32.lib")   //连接Netapi32.lib库,MAC获取中用到了NetApi32.DLL的功能
  9 
 10 void CMFCApplication4Dlg::OnBnClickedButton1()
 11 {
 12     // TODO: 在此添加控件通知处理程序代码
 13     WSADATA wsaData;
 14     char name[155];      //定义用于存放获得主机名的变量
 15     char *ip;            //定义IP地址变量
 16     PHOSTENT hostinfo;
 17 
 18     //调用MAKEWORD()获得Winsocl版本的正确值,用于下面的加载Winscok库
 19     if (WSAStartup(MAKEWORD(2, 0), &wsaData) == 0)
 20     {   //加载Winsock库,如果WSAStartup()函数返回值为0,说明加载成功,程序可以继续往下执行
 21         if (gethostname(name, sizeof(name)) == 0)
 22         { //如果成功,将本地主机名存放入由name参数指定的缓冲区中
 23             if ((hostinfo = gethostbyname(name)) != NULL)
 24             { //这是获取主机,如果获得主机名成功的话,将返回一个指针,指向hostinfo,hostinfo为PHOSTENT型的变量。
 25                 ip = inet_ntoa(*(struct in_addr *)*hostinfo->h_addr_list);
 26                 //inet_addr()函数把地址串转换为IP地址
 27                 //调用inet_ntoa()函数,将hostinfo结构变量中的h_addr_list转化为标准的IP地址(如202.197.11.12.)
 28                 CString str(ip);
 29                 AfxMessageBox(str);
 30             }
 31         }
 32         WSACleanup();         //卸载Winsock库,并释放所有资源
 33     }
 34 }
 35 
 36 
 37 void CMFCApplication4Dlg::OnBnClickedButton2()
 38 {
 39     // TODO: 在此添加控件通知处理程序代码
 40     NCB ncb;     //定义一个NCB(网络控制块)类型的结构体变量ncb
 41     typedef struct _ASTAT_     //自定义一个结构体_ASTAT_
 42     {
 43         ADAPTER_STATUS   adapt;
 44         NAME_BUFFER   NameBuff[30];
 45     }ASTAT, *PASTAT;
 46     ASTAT Adapter;
 47 
 48     typedef struct _LANA_ENUM     //自定义一个结构体_ASTAT_
 49     {
 50         UCHAR length;
 51         UCHAR lana[MAX_LANA];     //存放网卡MAC地址 
 52     }LANA_ENUM;
 53     LANA_ENUM lana_enum;
 54 
 55     //   取得网卡信息列表     
 56     UCHAR uRetCode;
 57     memset(&ncb, 0, sizeof(ncb));     //将已开辟内存空间ncb 的值均设为值 0
 58     memset(&lana_enum, 0, sizeof(lana_enum));     //清空一个结构类型的变量lana_enum,赋值为0
 59                                                   //对结构体变量ncb赋值
 60     ncb.ncb_command = NCBENUM;     //统计系统中网卡的数量
 61     ncb.ncb_buffer = (unsigned char *)&lana_enum; //ncb_buffer成员指向由LANA_ENUM结构填充的缓冲区
 62     ncb.ncb_length = sizeof(LANA_ENUM);
 63     //向网卡发送NCBENUM命令,以获取当前机器的网卡信息,如有多少个网卡,每个网卡的编号(MAC地址) 
 64     uRetCode = Netbios(&ncb); //调用netbois(ncb)获取网卡序列号    
 65     if (uRetCode != NRC_GOODRET)
 66     {
 67         AfxMessageBox(_T("error"));
 68     }
 69 
 70     //对每一个网卡,以其网卡编号为输入编号,获取其MAC地址   
 71     for (int lana = 0; lana < lana_enum.length; lana++)
 72     {
 73         ncb.ncb_command = NCBRESET;   //对网卡发送NCBRESET命令,进行初始化
 74         ncb.ncb_lana_num = lana_enum.lana[lana];
 75         uRetCode = Netbios(&ncb);
 76     }
 77     if (uRetCode != NRC_GOODRET)
 78     {
 79         AfxMessageBox(_T("error"));
 80     }
 81 
 82     //   准备取得接口卡的状态块取得MAC地址
 83     memset(&ncb, 0, sizeof(ncb));
 84     ncb.ncb_command = NCBASTAT;    //对网卡发送NCBSTAT命令,获取网卡信息
 85     ncb.ncb_lana_num = lana_enum.lana[0];     //指定网卡号,这里仅仅指定第一块网卡,通常为有线网卡 
 86     strcpy((char*)ncb.ncb_callname, "*");     //远程系统名赋值为*
 87     ncb.ncb_buffer = (unsigned char *)&Adapter; //指定返回的信息存放的变量
 88     ncb.ncb_length = sizeof(Adapter);
 89     //接着发送NCBASTAT命令以获取网卡的信息
 90     uRetCode = Netbios(&ncb);
 91     //   取得网卡的信息,并且如果网卡正常工作的话,返回标准的冒号分隔格式。   
 92     if (uRetCode != NRC_GOODRET)
 93     {
 94         AfxMessageBox(_T("error"));
 95     }
 96     //把网卡MAC地址格式转化为常用的16进制形式,输出到字符串
 97     CString strLocalMac;
 98     strLocalMac.Format(_T("%02X-%02X-%02X-%02X-%02X-%02X"),
 99         Adapter.adapt.adapter_address[0],
100         Adapter.adapt.adapter_address[1],
101         Adapter.adapt.adapter_address[2],
102         Adapter.adapt.adapter_address[3],
103         Adapter.adapt.adapter_address[4],
104         Adapter.adapt.adapter_address[5]
105     );
106     AfxMessageBox(strLocalMac);
107 }

 高版本的VS需要

项目属性 -> C/C++ -> 预处理器 -> 预处理器定义

_WINSOCK_DEPRECATED_NO_WARNINGS
_CRT_SECURE_NO_WARNINGS

posted @ 2021-04-20 14:24  ckrgd  阅读(974)  评论(0编辑  收藏  举报