zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Could not resolve com.android.support:appcompat-v7:28.0.0 错误处理
    解决 Could not resolve com.android.tools.build:gradle:3.1.3
    https://maven.google.com 连接不上的解决办法(转)
    jquery操作select(取值,设置选中)
    django 使用 request 获取浏览器发送的参数
    jquery下载,实时更新jquery1.2到最新3.3.1所有版本下载
    myeclipse 8.5反编译插件失效
    再探java基础——对面向对象的理解(2)
    庖丁解牛FPPopover
    去大连
  • 原文地址:https://www.cnblogs.com/ckrgd/p/14680885.html
Copyright © 2011-2022 走看看