PLM之家PLMHome-工业软件与AI结合践行者

[转载电子书] C++获得本机所有网卡MAC地址信息的实现方法

[复制链接]

2017-10-17 21:05:45 3669 0

admin 发表于 2017-10-17 21:05:45 |阅读模式

admin 楼主

2017-10-17 21:05:45

请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!

您需要 登录 才可以下载或查看,没有账号?注册

x
#include <WinSock2.h>4 ^, A3 @/ @* ^0 z! x
#include <Iphlpapi.h># e5 e- U7 _9 q
#include <iostream>
* u5 S# }/ s7 n" H$ O% z. }- ]; [using namespace std;) r/ q. K6 e+ U8 y
#pragma comment(lib,"Iphlpapi.lib") //需要添加Iphlpapi.lib库
* }9 b' m5 D4 T5 l. L6 [$ C7 r( s' X" e4 e7 A3 x5 n9 H
int main(int argc, char* argv[])( ?- q, t4 L8 D
{
1 b0 t/ K: `9 x: D% k+ E$ y5 |  //PIP_ADAPTER_INFO结构体指针存储本机网卡信息/ e7 r4 F, s0 J. H, D
  PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO();( q+ @6 q8 p* ~% Y: c
  //得到结构体大小,用于GetAdaptersInfo参数1 q3 b+ G' L7 F5 D; K
  unsigned long stSize = sizeof(IP_ADAPTER_INFO);( p/ i# B0 |4 K; J
  //调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量;其中stSize参数既是一个输入量也是一个输出量
0 T; q5 Z' Z/ s( `4 [- t" N  int nRel = GetAdaptersInfo(pIpAdapterInfo,&stSize);8 \8 a+ p! K( u8 A" ?
  //记录网卡数量% V) d  _3 |" F% ~# n' c" e
  int neTCardNum = 0;- ^0 C1 G; c3 U
  //记录每张网卡上的IP地址数量% J9 v6 E+ X! ?+ M$ ?7 x
  int IPnumPerNetCard = 0;, E) K$ ?. z1 A  X5 V& c
  if (ERROR_BUFFER_OVERFLOW == nRel)1 E, u4 {  w' C* o: k& v! n2 R
  {; Q3 }% j; A5 b3 z4 a3 F
    //如果函数返回的是ERROR_BUFFER_OVERFLOW
1 Z1 e7 O+ i9 Q) x7 a    //则说明GetAdaptersInfo参数传递的内存空间不够,同时其传出stSize,表示需要的空间大小% C  g% {4 X8 f6 S9 ]
    //这也是说明为什么stSize既是一个输入量也是一个输出量+ h9 }) E* d7 `4 Y. f
    //释放原来的内存空间( Y) [: d$ A- `0 Z2 s
    delete pIpAdapterInfo;
, S1 M, l3 P) ?, A3 i- r1 u    //重新申请内存空间用来存储所有网卡信息3 r# n1 J) S* R5 X
    pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize];
- j' x& F1 ?! E" Y    //再次调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量
2 j7 n" L9 U+ t2 K7 O7 `6 O# ?    nRel=GetAdaptersInfo(pIpAdapterInfo,&stSize);  ) L6 P) a4 \8 D, Q$ t- M8 M' o
  }
9 O  j: P6 }( w- O; O3 H" x  if (ERROR_SUCCESS == nRel)
7 F( I1 k9 K% @4 [# c  {
" f4 |# D/ w. k3 q7 w    //输出网卡信息/ k5 R* l- c( m6 w
     //可能有多网卡,因此通过循环去判断% n; O$ ^/ m: V& E2 ^
  while (pIpAdapterInfo)
7 x. B# n/ G8 P- f- l  {( V, D5 z/ \# _/ _1 ~) e& L: K9 R
    cout<<"网卡数量:"<<++netCardNum<<endl;9 X9 }! e. `  H1 S: \
    cout<<"网卡名称:"<<pIpAdapterInfo->AdapterName<<endl;9 c  w4 R8 U7 W' t; O
    cout<<"网卡描述:"<<pIpAdapterInfo->Description<<endl;
- m9 o) d% a8 S    switch(pIpAdapterInfo->Type)1 N$ X5 c, b$ |; n) a* q- ?5 l/ i  a
    {$ u* R$ P2 @0 Y4 H
    case MIB_IF_TYPE_OTHER:
' a  a) Y3 m3 o# J) T- j      cout<<"网卡类型:"<<"OTHER"<<endl;
4 V2 T/ I# L8 z# L* F  k- d      break;, v7 @2 _  g% v& M5 n4 Z; e
    case MIB_IF_TYPE_ETHERNET:$ Q# M$ U/ E$ M, x. Q% y
      cout<<"网卡类型:"<<"ETHERNET"<<endl;
7 G5 u8 p8 N, F      break;# l. Y6 Q3 C! W! P6 r
    case MIB_IF_TYPE_TOKENRING:
5 b( {  r1 L+ _' C      cout<<"网卡类型:"<<"TOKENRING"<<endl;1 {9 A+ N0 k9 F6 q" T
      break;. [. g# k  s. n9 o
    case MIB_IF_TYPE_FDDI:, d; I$ @" @7 M( [8 z, I- u$ f
      cout<<"网卡类型:"<<"FDDI"<<endl;' L9 u& o; X5 }, n2 D. n) r  R
      break;
2 d9 S* S$ b9 ~2 T    case MIB_IF_TYPE_PPP:
* c* z, y/ b5 r/ S% ^% B      printf("PP\n");8 w' u9 r, e# d% I: [
      cout<<"网卡类型:"<<"PPP"<<endl;! m5 w- P+ w  \! ~1 u, b( @
      break;
' [: I( Q: K- _) ?8 b/ z    case MIB_IF_TYPE_LOOPBACK:
) D; ?2 a1 f) q2 V% v: Z. U2 o$ V& O      cout<<"网卡类型:"<<"LOOPBACK"<<endl;/ N! k$ T* e+ D9 |2 }
      break;
2 D3 c5 L0 E& \( `    case MIB_IF_TYPE_SLIP:! W9 {3 ]0 y- M* p& J
      cout<<"网卡类型:"<<"SLIP"<<endl;
6 S% p  F0 {! A# }* c) g      break;
% v" _  ?( q+ n  [    default:
/ l; \' H7 {% ~7 c' V, Q( `$ G6 W8 A* v! U' ]
      break;$ k: J% ?2 [3 J" g5 V6 N: D) {7 U
    }/ N& U& j4 s4 u* {! }% s8 c
    cout<<"网卡MAC地址:";5 }. Z6 V; ^0 A1 R8 K
    for (DWORD i = 0; i < pIpAdapterInfo->AddressLength; i++)' d4 S2 g4 b! C+ e
      if (i < pIpAdapterInfo->AddressLength-1)$ ]1 }- G- A5 j0 d
      {
9 l6 k  q. o) p) Q' f        printf("%02X-", pIpAdapterInfo->Address);7 E# K; ^, [4 a$ w, z0 U
      }0 b0 J( U1 |  W' d( A
      else
( x; z& _7 e3 b8 ]: N# J      {
' u8 ~% B) X( z! P9 m' _& E        printf("%02X\n", pIpAdapterInfo->Address);
0 N( c' |0 n6 y* u- {! |      }
. h* l4 y9 B9 f2 I9 v) T5 M      cout<<"网卡IP地址如下:"<<endl;
  a$ ^! N7 `9 X3 L9 T. _: Z, z9 e      //可能网卡有多IP,因此通过循环去判断, a) |. M# x6 `' L) m
      IP_ADDR_STRING *pIpAddrString =&(pIpAdapterInfo->IpAddressList);
0 V4 z4 l* I  S  D2 f/ {$ l5 a      do3 N+ `8 D. \; m# m! X. T5 }5 J: I/ u
      {
$ t* d' b; h  N6 P$ j        cout<<"该网卡上的IP数量:"<<++IPnumPerNetCard<<endl;
. Z$ a: b6 x8 G  H        cout<<"IP 地址:"<<pIpAddrString->IpAddress.String<<endl;$ x/ e* L6 Y( B6 B# i: q+ W
        cout<<"子网地址:"<<pIpAddrString->IpMask.String<<endl;, w% c4 W4 J; b% E* |  [
        cout<<"网关地址:"<<pIpAdapterInfo->GatewayList.IpAddress.String<<endl;# V& i, D( K2 r9 L4 L7 Q
        pIpAddrString=pIpAddrString->Next;
5 F  K9 d) S% O& b& t% w      } while (pIpAddrString);' x/ ]0 h- o* A4 ^. V7 `2 P
      pIpAdapterInfo = pIpAdapterInfo->Next;
6 H; E! b2 o, y/ X; m' M: x      cout<<"--------------------------------------------------------------------"<<endl;, @& @  m0 j0 |, K
  }" e) C( q# Y# k5 v4 ^6 @
   
1 }) a+ s% n! F4 e  }
0 z( A5 g  }* s  C! E6 u/ L  //释放内存空间
' y* S9 A: f8 ~9 t( [3 h  if (pIpAdapterInfo)
3 J# Q5 O, W& a" w' a  {
( P( p6 m8 s. W" J2 C3 L    delete pIpAdapterInfo;, y: b9 ^3 z$ W$ R4 x. |" v
  }
5 J  v, }& o; b+ \' f  
7 I& s! r3 C0 i% d& [, Z: }  return 0;' z" b2 C; L6 E- b$ |
}
& Z/ e/ r; \% x- G) d$ Y. v0 H/ O' \2 f. Q! ?
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 doTeam.tech
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 注册

返回列表 本版积分规则

  • 发布新帖

  • 在线客服

  • 微信

  • 客户端

  • 返回顶部

  • x
    温馨提示

    本网站(plmhome.com)为PLM之家工业软件学习官网站

    展示的视频材料全部免费,需要高清和特殊技术支持请联系 QQ: 939801026

    PLM之家NX CAM二次开发专题模块培训报名开始啦

    我知道了