zoukankan      html  css  js  c++  java
  • 读取网络适配器所有的物理地址

    这个方法虽然可以得到网络适配器所有活动的物理地址,但是网卡名称有点奇怪,最后用getmac发现应该是对应的文件名

      1 #include <WinSock2.h>
      2 #include <Iphlpapi.h>
      3 #include <iostream>
      4 #include <cstring>
      5 #include <cctype>
      6 #include <tchar.h>
      7 #include <windows.h>
      8 #include <cstdlib>
      9 using namespace std;
     10 #pragma comment(lib,"Iphlpapi.lib") //需要添加Iphlpapi.lib库
     11 
     12 
     13 int main(int argc, char* argv[])
     14 {
     15     //PIP_ADAPTER_INFO结构体指针存储本机网卡信息
     16     PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO();
     17     //得到结构体大小,用于GetAdaptersInfo参数
     18     unsigned long stSize = sizeof(IP_ADAPTER_INFO);
     19     //调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量;其中stSize参数既是一个输入量也是一个输出量
     20     int nRel = GetAdaptersInfo(pIpAdapterInfo, &stSize);
     21     //记录网卡数量
     22     int netCardNum = 0;
     23     //记录每张网卡上的IP地址数量
     24     int IPnumPerNetCard = 0;
     25     if (ERROR_BUFFER_OVERFLOW == nRel)
     26     {
     27         //如果函数返回的是ERROR_BUFFER_OVERFLOW
     28         //则说明GetAdaptersInfo参数传递的内存空间不够,同时其传出stSize,表示需要的空间大小
     29         //这也是说明为什么stSize既是一个输入量也是一个输出量
     30         //释放原来的内存空间
     31         delete pIpAdapterInfo;
     32         //重新申请内存空间用来存储所有网卡信息
     33         pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize];
     34         //再次调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量
     35         nRel = GetAdaptersInfo(pIpAdapterInfo, &stSize);
     36     }
     37     if (ERROR_SUCCESS == nRel)
     38     {
     39         //输出网卡信息
     40         //可能有多网卡,因此通过循环去判断
     41         while (pIpAdapterInfo)
     42         {
     43             cout << "网卡数量:" << ++netCardNum << endl;
     44             wchar_t s[100];
     45             int m = change(s, pIpAdapterInfo->AdapterName, 4);
     46             std::wcout.imbue(std::locale("chs"));
     47             for (int i = 0; i < m;++i){
     48                 wcout << s[i];
     49             }
     50             cout << endl;
     51             cout << "网卡名称:" << pIpAdapterInfo->AdapterName << endl;
     52             cout << "网卡描述:" << pIpAdapterInfo->Description << endl;
     53             switch (pIpAdapterInfo->Type)
     54             {
     55             case MIB_IF_TYPE_OTHER:
     56                 cout << "网卡类型:" << "OTHER" << endl;
     57                 break;
     58             case MIB_IF_TYPE_ETHERNET:
     59                 cout << "网卡类型:" << "ETHERNET" << endl;
     60                 break;
     61             case MIB_IF_TYPE_TOKENRING:
     62                 cout << "网卡类型:" << "TOKENRING" << endl;
     63                 break;
     64             case MIB_IF_TYPE_FDDI:
     65                 cout << "网卡类型:" << "FDDI" << endl;
     66                 break;
     67             case MIB_IF_TYPE_PPP:
     68                 printf("PP
    ");
     69                 cout << "网卡类型:" << "PPP" << endl;
     70                 break;
     71             case MIB_IF_TYPE_LOOPBACK:
     72                 cout << "网卡类型:" << "LOOPBACK" << endl;
     73                 break;
     74             case MIB_IF_TYPE_SLIP:
     75                 cout << "网卡类型:" << "SLIP" << endl;
     76                 break;
     77             default:
     78 
     79                 break;
     80             }
     81             cout << "网卡MAC地址:";
     82             for (DWORD i = 0; i < pIpAdapterInfo->AddressLength; i++)
     83                 if (i < pIpAdapterInfo->AddressLength - 1)
     84                 {
     85                 printf("%02X-", pIpAdapterInfo->Address[i]);
     86                 }
     87                 else
     88                 {
     89                     printf("%02X
    ", pIpAdapterInfo->Address[i]);
     90                 }
     91             cout << "网卡IP地址如下:" << endl;
     92             //可能网卡有多IP,因此通过循环去判断
     93             IP_ADDR_STRING *pIpAddrString = &(pIpAdapterInfo->IpAddressList);
     94             do
     95             {
     96                 cout << "该网卡上的IP数量:" << ++IPnumPerNetCard << endl;
     97                 cout << "IP 地址:" << pIpAddrString->IpAddress.String << endl;
     98                 cout << "子网地址:" << pIpAddrString->IpMask.String << endl;
     99                 cout << "网关地址:" << pIpAdapterInfo->GatewayList.IpAddress.String << endl;
    100                 pIpAddrString = pIpAddrString->Next;
    101             } while (pIpAddrString);
    102             pIpAdapterInfo = pIpAdapterInfo->Next;
    103             cout << "--------------------------------------------------------------------" << endl;
    104         }
    105 
    106     }
    107     //释放内存空间
    108     if (pIpAdapterInfo)
    109     {
    110         delete pIpAdapterInfo;
    111     }
    112     cin >> IPnumPerNetCard;
    113     return 0;
    114 }

    结果如下

     1 结果如下
     2 网卡数量:1
     3 网卡名称:{34E8CE08-E330-4F31-8897-DD417D5AFB45}
     4 网卡描述:Bluetooth
     5 网卡类型:ETHERNET
     6 网卡MAC地址:4C-34-88-51-32-49
     7 网卡IP地址如下:
     8 该网卡上的IP数量:1
     9 IP 地址:0.0.0.0
    10 子网地址:0.0.0.0
    11 网关地址:0.0.0.0
    12 --------------------------------------------------------------------
    13 网卡数量:2
    14 网卡名称:{9ED36AE1-4501-4308-BEEE-969EE3507D7C}
    15 网卡描述:Microsoft Virtual WiFi Miniport Adapter #2
    16 网卡MAC地址:4E-34-88-51-32-45
    17 网卡IP地址如下:
    18 该网卡上的IP数量:2
    19 IP 地址:0.0.0.0
    20 子网地址:0.0.0.0
    21 网关地址:0.0.0.0
    22 --------------------------------------------------------------------
    23 网卡数量:3
    24 网卡名称:{9F159D09-51FB-4E07-92E7-80338A546FCB}
    25 网卡描述:Microsoft Virtual WiFi Miniport Adapter
    26 网卡MAC地址:4E-34-88-51-32-46
    27 网卡IP地址如下:
    28 该网卡上的IP数量:3
    29 IP 地址:0.0.0.0
    30 子网地址:0.0.0.0
    31 网关地址:0.0.0.0
    32 --------------------------------------------------------------------
    33 网卡数量:4
    34 网卡名称:{2757C5FC-7C56-47A4-92EE-A4389E5FC188}
    35 网卡描述:Intel(R) Wireless-N 7265
    36 网卡MAC地址:4C-34-88-51-32-45
    37 网卡IP地址如下:
    38 该网卡上的IP数量:4
    39 IP 地址:10.173.41.203
    40 子网地址:255.255.224.0
    41 网关地址:10.173.32.1
    42 --------------------------------------------------------------------
    43 网卡数量:5
    44 网卡名称:{9464845C-3567-423D-B5E1-4C70E14180C5}
    45 网卡描述:Intel(R) Ethernet Connection (3) I218-V
    46 网卡类型:ETHERNET
    47 网卡MAC地址:50-7B-9D-20-CD-16
    48 网卡IP地址如下:
    49 该网卡上的IP数量:5
    50 IP 地址:0.0.0.0
    51 子网地址:0.0.0.0
    52 网关地址:0.0.0.0
    53 --------------------------------------------------------------------
    54 网卡数量:6
    55 网卡名称:{E0A7B432-2D66-4987-967A-1FBF1F594D6A}
    56 网卡描述:VMware Virtual Ethernet Adapter for VMnet1
    57 网卡类型:ETHERNET
    58 网卡MAC地址:00-50-56-C0-00-01
    59 网卡IP地址如下:
    60 该网卡上的IP数量:6
    61 IP 地址:192.168.60.1
    62 子网地址:255.255.255.0
    63 网关地址:0.0.0.0
    64 --------------------------------------------------------------------
    65 网卡数量:7
    66 网卡名称:{75C778C8-2EE7-4737-B5B5-411566D52521}
    67 网卡描述:VMware Virtual Ethernet Adapter for VMnet8
    68 网卡类型:ETHERNET
    69 网卡MAC地址:00-50-56-C0-00-08
    70 网卡IP地址如下:
    71 该网卡上的IP数量:7
    72 IP 地址:192.168.19.1
    73 子网地址:255.255.255.0
    74 网关地址:0.0.0.0
    75 ------------------------------------------------------------------

    用getmac命令结果如下:

    与上面的网卡名称相同显然是一致的,这个留待以后研究

  • 相关阅读:
    Oracle 性能优化之一二
    要一直知道什么是最重要的
    c# 当引用类型作为方法的参数
    BI测试工具之跨数据库数据对比,支持oracle,sqlserver
    c#分页读取GB文本文件
    Merge compare columns when null
    Oracle常用plsql
    quick sort java version
    基于元数据的ETL系统
    Centos 6.5(64bit)上安装Vertica single node
  • 原文地址:https://www.cnblogs.com/onlyac/p/5346507.html
Copyright © 2011-2022 走看看