PLM之家PLMHome-国产软件践行者

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

[复制链接]

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

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

admin 楼主

2017-10-17 21:05:45

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

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

x
#include <WinSock2.h>, s: d2 o1 \  w7 [/ \
#include <Iphlpapi.h>
3 f' c( S+ q# I- h#include <iostream>
# Q' J" d* H7 |) ?. X  fusing namespace std;
0 s; v( m: b& S( K9 s5 R#pragma comment(lib,"Iphlpapi.lib") //需要添加Iphlpapi.lib库. \3 }1 [$ K7 u

$ `" `; N$ L6 }4 D5 N; ^9 ~  Fint main(int argc, char* argv[])
4 T0 c; h+ A: P) W- Z; ]) A: D{
, O+ e$ u/ w% {( `! v. w  //PIP_ADAPTER_INFO结构体指针存储本机网卡信息
0 r. I" N  n0 Y( E% V+ u) f2 h  _  PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO();3 Z" e8 B" |& e' B1 U
  //得到结构体大小,用于GetAdaptersInfo参数
) E$ J+ L$ J8 I' O2 N! q  unsigned long stSize = sizeof(IP_ADAPTER_INFO);
! g# e. f+ {# A! s  //调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量;其中stSize参数既是一个输入量也是一个输出量( ]. u% x, y' ^% @
  int nRel = GetAdaptersInfo(pIpAdapterInfo,&stSize);
4 u4 m* R: W7 f9 x, P( t1 H  //记录网卡数量
6 l9 s6 |. A) u" e$ J/ d  int neTCardNum = 0;# w: J) w2 [3 n$ x
  //记录每张网卡上的IP地址数量
6 p# o8 U# z3 N3 \9 b0 q  int IPnumPerNetCard = 0;
: d) p; V* j1 J8 l( @  if (ERROR_BUFFER_OVERFLOW == nRel)
( d5 z; H8 M2 q. M  {& S! @7 t5 l: U$ u# D
    //如果函数返回的是ERROR_BUFFER_OVERFLOW
* g1 \' e- n- T0 ~    //则说明GetAdaptersInfo参数传递的内存空间不够,同时其传出stSize,表示需要的空间大小
0 K' x, n& |% U3 V2 u    //这也是说明为什么stSize既是一个输入量也是一个输出量
5 P# a8 [5 P5 E& ^# A& k    //释放原来的内存空间
* W5 q+ i- ?0 z/ R1 J! M2 u" M    delete pIpAdapterInfo;6 V1 z& {1 [2 y* `: I  ~! y
    //重新申请内存空间用来存储所有网卡信息: w; l% O$ M0 S' c7 q
    pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize];
. x: @6 {/ h$ j9 U    //再次调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量
4 Q% r+ U  D8 ~    nRel=GetAdaptersInfo(pIpAdapterInfo,&stSize);  
" `2 }; h  g: S# y. }/ L3 k  }0 P$ w0 n4 r' l! g( S" z
  if (ERROR_SUCCESS == nRel); l' v1 Z) u9 }" p1 V
  {) }. J+ ?" y0 f$ l4 |% O+ p* F" r/ Q
    //输出网卡信息. Z3 F' ~7 g, e" B' d) A$ s0 H
     //可能有多网卡,因此通过循环去判断
' G* G6 Y! M1 p) e/ s  while (pIpAdapterInfo)
1 ?2 k+ o! o  s) T  {
: |: r! B* R& }2 t1 _    cout<<"网卡数量:"<<++netCardNum<<endl;7 y: P1 W7 N" w! b8 H" a8 M; M: x) S
    cout<<"网卡名称:"<<pIpAdapterInfo->AdapterName<<endl;
1 t6 a  s+ P3 y' o5 Q    cout<<"网卡描述:"<<pIpAdapterInfo->Description<<endl;3 r3 _6 U" b" o3 Q1 q5 B! |4 h
    switch(pIpAdapterInfo->Type)
$ R: o) E, @/ H; j4 p5 q    {
9 ~9 z: ]& k0 F6 }    case MIB_IF_TYPE_OTHER:
+ {! D5 R' M: ]9 D4 f, G. \      cout<<"网卡类型:"<<"OTHER"<<endl;
" i, q/ [: U9 ?  B. d. \8 C      break;
% ?9 C' F% ]) w2 b    case MIB_IF_TYPE_ETHERNET:( v8 \2 ]6 Q% v7 f+ q0 B
      cout<<"网卡类型:"<<"ETHERNET"<<endl;: c4 k+ ?( o, U3 }' M+ r% n% J1 R
      break;
" [+ a2 N6 `" Y( K    case MIB_IF_TYPE_TOKENRING:
5 y# r+ O/ i* o& r. R      cout<<"网卡类型:"<<"TOKENRING"<<endl;0 W& W: }; ?8 P
      break;
. H. v( {/ a6 a4 G- b    case MIB_IF_TYPE_FDDI:1 c9 j/ U4 K. S" @5 ^/ l5 [- h* y
      cout<<"网卡类型:"<<"FDDI"<<endl;
+ V9 g1 T" ~( X+ F1 S! s  j% {6 P      break;
4 ^# g! x! U7 s) V5 J! j4 V6 a    case MIB_IF_TYPE_PPP:
6 H/ x5 w. W# }: _4 F% f2 a& A      printf("PP\n");
) _9 N$ U  S0 |; T" `. m      cout<<"网卡类型:"<<"PPP"<<endl;
; n3 N1 I# O& S, `9 O7 J5 \. k      break;
- n5 ^! D% J) |  I3 y) q    case MIB_IF_TYPE_LOOPBACK:; `* V0 g* k) J( }+ N
      cout<<"网卡类型:"<<"LOOPBACK"<<endl;
5 g6 ^- ^" Y- a7 _      break;
( ], y* M1 V" D3 ]/ k8 T0 t1 l; A) T    case MIB_IF_TYPE_SLIP:
% i! y- }- q2 u. x      cout<<"网卡类型:"<<"SLIP"<<endl;
9 ?, h7 V, p% \9 m0 z8 O- \6 B+ n      break;
) L: V- u$ X9 d! A' T3 V    default:
2 G0 Q  o1 l. o+ ]% ~/ L
# Y$ e' C$ `/ D- H, o2 t: E      break;8 \7 Z/ B3 U1 r/ l- f. m
    }% F2 I  Q1 K" R5 l. z: Y* L
    cout<<"网卡MAC地址:";) k- y% q" Z4 l, H5 {
    for (DWORD i = 0; i < pIpAdapterInfo->AddressLength; i++)9 x. r3 r. b. D$ U- w( e
      if (i < pIpAdapterInfo->AddressLength-1)
0 Y1 m0 f6 r! B  Z      {
& l  V  |* y1 T3 T& C        printf("%02X-", pIpAdapterInfo->Address);/ w/ C( m' O9 e' T  k* B: A, t
      }) h4 [* G( B* j& J$ C
      else
* _: V3 `- o8 L9 S      {2 L# {0 W: P, v  G: `
        printf("%02X\n", pIpAdapterInfo->Address);# y: g$ |5 P6 S- w
      }
) C+ n" \% o. }: Z9 x9 Z. z      cout<<"网卡IP地址如下:"<<endl;
7 p* l# e# X2 L  k      //可能网卡有多IP,因此通过循环去判断
9 D& a* |, _  H/ `$ V0 k) E% M' x      IP_ADDR_STRING *pIpAddrString =&(pIpAdapterInfo->IpAddressList);
' f- ^& y( p# O6 N8 Y1 V0 Y$ Y      do
7 q0 V& V7 w) m, H+ v1 Z      {/ G2 V. }# G! N  X4 R
        cout<<"该网卡上的IP数量:"<<++IPnumPerNetCard<<endl;0 J8 r1 ~9 g6 }; U/ |: s
        cout<<"IP 地址:"<<pIpAddrString->IpAddress.String<<endl;
' y; {( M$ f. s        cout<<"子网地址:"<<pIpAddrString->IpMask.String<<endl;
- x4 h: K2 g3 V& T/ ^0 ~        cout<<"网关地址:"<<pIpAdapterInfo->GatewayList.IpAddress.String<<endl;4 F2 X/ S2 Y+ h+ P+ f5 c
        pIpAddrString=pIpAddrString->Next;3 _; `3 e6 u6 C1 Q" P! R
      } while (pIpAddrString);
# G4 c, a" F1 C* Z: m: z- r      pIpAdapterInfo = pIpAdapterInfo->Next;
- i0 _. ]% J! ^' b      cout<<"--------------------------------------------------------------------"<<endl;* u$ y: g/ v( x
  }7 L" @: W6 k5 x
   4 d  b8 y6 ?; ?6 B2 h: i0 X
  }* Y* I5 w# `* d, l; w; Q- I7 F
  //释放内存空间
& a: [" m: F& @; b1 ~  if (pIpAdapterInfo); \. d/ {, I" }
  {: i" H4 A! J. u4 R: g* A
    delete pIpAdapterInfo;% ?$ _; d, Z) ^2 b' ~) @
  }% W" N2 K& d% x) [3 t( t
  ) M7 X; b' }( f$ T& n7 j2 M2 ^
  return 0;6 O1 {, j& F1 N, @4 N
}
6 C/ U) ^$ @8 E+ h( }0 z$ K: u6 K0 M) L
. S2 a3 Q, K. i5 o" i" P, I  B% ^
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了