PLM之家PLMHome-工业软件践行者

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

[复制链接]

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

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

admin 楼主

2017-10-17 21:05:45

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

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

x
#include <WinSock2.h>
) z: R4 L: ~$ T( y5 Q+ x7 C/ f- v: z#include <Iphlpapi.h>
. V& b4 b7 S. A: |. S2 C#include <iostream>
+ J: `# [& {3 y" F; x! Zusing namespace std;' l& W7 ^# J$ _5 d8 j0 y) g. T
#pragma comment(lib,"Iphlpapi.lib") //需要添加Iphlpapi.lib库+ m2 ^6 p4 F* R) H, W# y+ E

- g  M- V  w" ~% }8 M, Kint main(int argc, char* argv[])
4 \1 Q( H1 Q  V6 Z2 e3 c0 H{
+ y& I9 E& G) S5 M9 X+ L( h  //PIP_ADAPTER_INFO结构体指针存储本机网卡信息
) z% v9 D7 p# Z; M  PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO();; y3 f. X: Q- @: e
  //得到结构体大小,用于GetAdaptersInfo参数
/ ~) A! w0 K8 q5 y3 ^7 t, v. [  unsigned long stSize = sizeof(IP_ADAPTER_INFO);; N5 B$ p* J- _
  //调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量;其中stSize参数既是一个输入量也是一个输出量' J" ]/ d0 b& I. D  U
  int nRel = GetAdaptersInfo(pIpAdapterInfo,&stSize);
3 b0 O* N# A5 V1 I% O  //记录网卡数量  O0 {7 S2 x8 Y0 Y
  int neTCardNum = 0;
; o% o4 d/ Q6 {: G8 E; R  //记录每张网卡上的IP地址数量
# U( q& T; m( q  int IPnumPerNetCard = 0;7 a2 @3 p2 V7 y8 ^# m  w7 A
  if (ERROR_BUFFER_OVERFLOW == nRel)
- ~% |+ D" F* f  {, H+ Q1 R7 F% S% q2 u, ~5 |% \/ T
    //如果函数返回的是ERROR_BUFFER_OVERFLOW
- l. Q5 D5 m( C% `, l8 S- q    //则说明GetAdaptersInfo参数传递的内存空间不够,同时其传出stSize,表示需要的空间大小- q$ z+ X5 ]1 s% T! ^
    //这也是说明为什么stSize既是一个输入量也是一个输出量
) h/ c1 s3 O1 @, P+ H    //释放原来的内存空间% T% K; P7 P) G3 }3 j& f
    delete pIpAdapterInfo;" l; R7 _( J3 i: b9 K/ F! T
    //重新申请内存空间用来存储所有网卡信息; X" Z2 _, b* ]- j+ p4 B
    pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize];/ _/ P8 s+ k$ f# [9 ~; `7 _+ Y' S
    //再次调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量; V5 ]- @& e5 c% B
    nRel=GetAdaptersInfo(pIpAdapterInfo,&stSize);  
: p) W, [: T; ^0 N  }% s6 p0 }% s+ i3 y" }9 A
  if (ERROR_SUCCESS == nRel)
$ K8 Y; l. v  f  {
6 G) Z& b1 N! W, G$ L    //输出网卡信息
; j& W/ ^) Z9 H" p5 ?. d     //可能有多网卡,因此通过循环去判断& F/ \" }; u- T0 _! a) X! |
  while (pIpAdapterInfo)9 U$ Z% Y6 V" |
  {9 L; G3 m- ^; w
    cout<<"网卡数量:"<<++netCardNum<<endl;0 F% r4 S3 |& w! ~3 Z/ g+ j4 r
    cout<<"网卡名称:"<<pIpAdapterInfo->AdapterName<<endl;3 S8 N* k1 T( @; g
    cout<<"网卡描述:"<<pIpAdapterInfo->Description<<endl;+ J4 `. x* `; D- h
    switch(pIpAdapterInfo->Type); I+ `3 ^8 W' @& g- Z3 r8 R' H/ y7 \
    {* Q% p2 |- G6 m. A! m7 D- b2 X6 d+ j
    case MIB_IF_TYPE_OTHER:
7 m( E( y' S3 `' P9 A+ f3 z; V      cout<<"网卡类型:"<<"OTHER"<<endl;: i9 {, U; ?3 ^/ n" T; |
      break;
0 S8 U, j+ X9 Q( Y9 O' ~    case MIB_IF_TYPE_ETHERNET:
9 f/ S9 j. T% w      cout<<"网卡类型:"<<"ETHERNET"<<endl;/ r" H0 u7 X( i5 E$ E; I
      break;
  K: }. H1 J% v4 ]- V3 ?; {    case MIB_IF_TYPE_TOKENRING:
4 H) @3 p/ K9 h6 H2 }  Y3 Y      cout<<"网卡类型:"<<"TOKENRING"<<endl;
0 T* l6 H9 G' ?+ F0 H6 t      break;' Z& G0 F  q2 p' |
    case MIB_IF_TYPE_FDDI:$ E& z; G5 }; G
      cout<<"网卡类型:"<<"FDDI"<<endl;
) m- v" @# q8 J; i7 r& B; N. K      break;) X' d: P. I& A6 l3 f
    case MIB_IF_TYPE_PPP:! Q1 g  E+ n, N; Z4 R
      printf("PP\n");" K6 u, F# y* c, K+ @
      cout<<"网卡类型:"<<"PPP"<<endl;/ Y2 G; P7 z6 _5 C5 i- e
      break;0 ?1 G) y# h: S* m4 V4 Y) K4 ]
    case MIB_IF_TYPE_LOOPBACK:
/ N) ]2 N1 v* y2 t      cout<<"网卡类型:"<<"LOOPBACK"<<endl;
1 K% z! c6 a2 `, b0 O, }      break;
. r% B8 ], u* H9 P4 _    case MIB_IF_TYPE_SLIP:6 `! p  r% z4 y' c) a0 F
      cout<<"网卡类型:"<<"SLIP"<<endl;
0 g2 T/ [9 d$ o! r( u2 g      break;
& l: B0 w) n. _5 A! G4 }' _    default:2 {5 S% s3 c, E8 [: ~: l1 [
+ ?! V5 C0 V/ x/ N" R& ~  V4 W9 j6 z
      break;
9 G& m( a9 _4 n5 j    }. a. d- p) [$ _2 k) W2 f/ P% W
    cout<<"网卡MAC地址:";5 @' h( n4 p; _6 q
    for (DWORD i = 0; i < pIpAdapterInfo->AddressLength; i++)
1 p; f9 t/ y4 L( W      if (i < pIpAdapterInfo->AddressLength-1)0 [% H" s+ n7 s
      {
+ N1 b3 Q+ n* \# M' `7 w8 R4 a        printf("%02X-", pIpAdapterInfo->Address);
* L: o. M8 ^6 R  b: g6 z* Z3 J' N      }
9 [. m* x) u5 M/ E1 L      else
$ L$ H$ R2 f5 H, m      {
7 l' w; ~5 l" r1 @: n. v& ]' J) j        printf("%02X\n", pIpAdapterInfo->Address);: D* o2 I# j/ O. i4 P. m8 g0 b8 ]
      }
5 n- P) J; X& x. N1 \( A      cout<<"网卡IP地址如下:"<<endl;" B) k( s' s$ `+ \$ T4 ^; i- ^
      //可能网卡有多IP,因此通过循环去判断
& d4 A  v' W( B7 t. O) p2 c. {4 o' \5 a      IP_ADDR_STRING *pIpAddrString =&(pIpAdapterInfo->IpAddressList);& S# S4 i( `. C
      do
8 \" [  K/ O7 K! L! n- p) \, i      {7 R7 `2 Z8 t, \& `5 G5 Q# f2 q4 f
        cout<<"该网卡上的IP数量:"<<++IPnumPerNetCard<<endl;" _' K# Z8 j1 j" n3 g, O
        cout<<"IP 地址:"<<pIpAddrString->IpAddress.String<<endl;
' M/ Z; r6 n/ a        cout<<"子网地址:"<<pIpAddrString->IpMask.String<<endl;
+ G1 L: V# n7 K' _        cout<<"网关地址:"<<pIpAdapterInfo->GatewayList.IpAddress.String<<endl;1 D- Q. q8 h5 j8 m8 J6 {# k
        pIpAddrString=pIpAddrString->Next;4 N% b+ P9 Q+ l. z) m$ |+ N
      } while (pIpAddrString);
: T* R) V  }) @% G6 q+ c- h$ U      pIpAdapterInfo = pIpAdapterInfo->Next;0 H9 \* N# n0 C4 x+ s& c
      cout<<"--------------------------------------------------------------------"<<endl;
' k- ^5 y% `- ]7 J2 W7 e  }' {8 x" q3 O: X1 a7 i/ x
   
# U* f+ D4 F% T0 N7 {4 `% K1 C  }
4 u) C( T* t2 |! ?. c: j: u  //释放内存空间
7 M+ Z. s; I" I6 _# d8 j0 y+ l  if (pIpAdapterInfo)! |$ ^; W3 P9 o
  {+ t7 b3 o, C+ b/ ~( E- x
    delete pIpAdapterInfo;2 k4 i4 j! v8 ?4 ?# J
  }
7 S  |/ ?2 h" B  
% O. B. {6 p+ ~3 R  return 0;5 e' g6 O7 k! e- A' K) b- \; D
}
. \. ~  {) `5 @( J! k5 l# E5 `
) g) u8 W( k9 j; i  W2 p7 `: \" I
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了