查看: 3829|回复: 0

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

[复制链接]

6

主题

4

回帖

60

积分

管理员

积分
60
发表于 2017-10-17 21:05:45 | 显示全部楼层 |阅读模式

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

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

×
#include <WinSock2.h>
) ]) N* x$ R( ^#include <Iphlpapi.h>" a+ E; o' ]( o
#include <iostream>, c2 I. r4 q' i; t( E& l
using namespace std;+ c. S; a# K. r/ R0 q  W- \- _
#pragma comment(lib,"Iphlpapi.lib") //需要添加Iphlpapi.lib库, e# D4 f5 v0 |& F, a3 W( `

" n/ }9 T5 s' {& ?' s$ j: X" aint main(int argc, char* argv[])
2 C) e# C& y; m2 }, x6 p+ |{" N( i8 G1 ?/ C+ j- H2 R
  //PIP_ADAPTER_INFO结构体指针存储本机网卡信息0 z+ V7 f8 R- |' A. J0 f3 R8 p
  PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO();3 e/ R. E3 {) \3 H0 @1 G
  //得到结构体大小,用于GetAdaptersInfo参数1 H& ?6 h( Y. x( K( A) t, A
  unsigned long stSize = sizeof(IP_ADAPTER_INFO);
* e' w  `6 j. d  g6 a# D/ M* X6 R  //调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量;其中stSize参数既是一个输入量也是一个输出量; q6 a# k7 J* G' I0 s
  int nRel = GetAdaptersInfo(pIpAdapterInfo,&stSize);$ H, x5 ]3 s# w: D& [+ l
  //记录网卡数量2 g( H5 R. \' `- ~1 I4 H
  int neTCardNum = 0;$ ?2 _& j% L" w, f- ?8 E! Y/ n
  //记录每张网卡上的IP地址数量
6 ?' X( b) H3 b& T3 ~7 D  int IPnumPerNetCard = 0;) _, ?. H/ y/ J& O
  if (ERROR_BUFFER_OVERFLOW == nRel)& H; Q+ a2 u; P5 w( `7 @6 t3 b" n
  {
5 ]; X) @; w; b+ _/ k  ^( d; _    //如果函数返回的是ERROR_BUFFER_OVERFLOW9 l1 f% \' E9 D$ ?: f& N
    //则说明GetAdaptersInfo参数传递的内存空间不够,同时其传出stSize,表示需要的空间大小
3 j% c. B  e6 w' ~1 f1 X    //这也是说明为什么stSize既是一个输入量也是一个输出量# v( r2 r9 v- z2 T
    //释放原来的内存空间6 l+ B8 \& c' {  l
    delete pIpAdapterInfo;
- k+ z* ~* m% d) H    //重新申请内存空间用来存储所有网卡信息
. Y: s! E; ~1 K# a3 I6 L& ]' g    pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize];6 ^, @& p6 S( }% {; s4 I5 p& H
    //再次调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量
+ {! B+ R+ T: w( r3 D/ T, {' W    nRel=GetAdaptersInfo(pIpAdapterInfo,&stSize);  
( Q2 O( _: |" l+ t( i, a2 B  }
/ O  g/ _- S) \' R  if (ERROR_SUCCESS == nRel)
# y6 i; l, N5 b' L1 f  {0 v, |) V8 y+ }1 J1 H
    //输出网卡信息
2 U: k9 G. f6 b% o     //可能有多网卡,因此通过循环去判断
: c) E" T) Z/ N: e: e7 X4 f  while (pIpAdapterInfo)* y" a3 W) b6 ^5 \$ G0 b
  {& ^4 G' x( V& Q
    cout<<"网卡数量:"<<++netCardNum<<endl;
7 M  J: M7 U4 P9 c2 H% U& }* c    cout<<"网卡名称:"<<pIpAdapterInfo->AdapterName<<endl;) f: u- C0 H/ o1 E. Y
    cout<<"网卡描述:"<<pIpAdapterInfo->Description<<endl;! l0 Q( }. L; o# p4 a
    switch(pIpAdapterInfo->Type)0 G" ?# a7 [" C: D. h3 J# m
    {
: Y! h) N% E- E0 w6 Z1 @2 e2 ^3 O    case MIB_IF_TYPE_OTHER:  O6 f7 o& H' u. D# R, R
      cout<<"网卡类型:"<<"OTHER"<<endl;
. _* F1 x- y* w      break;
, n: J+ }7 }$ n7 Q, O8 d    case MIB_IF_TYPE_ETHERNET:
, N( {# z5 t3 {  W# j/ G8 n9 L      cout<<"网卡类型:"<<"ETHERNET"<<endl;* U/ k* J0 e2 V' L; r. O( y
      break;
5 ~* S; ?3 z6 E( q' e/ ^  W& d7 r    case MIB_IF_TYPE_TOKENRING:
$ y: o, y) E5 x. `4 ~3 J9 c* }* W  D7 Z      cout<<"网卡类型:"<<"TOKENRING"<<endl;
0 c2 K7 G( X0 e      break;. z7 D% @: e! z: o
    case MIB_IF_TYPE_FDDI:0 B4 h) I# [$ C
      cout<<"网卡类型:"<<"FDDI"<<endl;
! }. X0 P% T" }0 Z9 [; `      break;% ]* h; A: r5 y$ V3 m
    case MIB_IF_TYPE_PPP:: Q* Y$ `, d) L% ?: F; l; B
      printf("PP\n");, Z- p8 c. S2 D: F, i- r( m8 B- N4 [+ t
      cout<<"网卡类型:"<<"PPP"<<endl;& Y+ A' F$ k1 L: m( w/ e- l
      break;% r8 i, {' j3 i3 E' A* p
    case MIB_IF_TYPE_LOOPBACK:* S3 m4 K4 s7 _! t$ Q
      cout<<"网卡类型:"<<"LOOPBACK"<<endl;
9 n8 N$ ^6 v$ v      break;7 z" \0 x. y' _( B- F
    case MIB_IF_TYPE_SLIP:. j, T% J  S( \" Y, u* m+ H& m, ~
      cout<<"网卡类型:"<<"SLIP"<<endl;( y9 e0 S! }, _# k- N6 c6 {
      break;
; H2 t6 b1 g: A6 f6 }/ z& M    default:, G) e% D: g( @& [8 O
) Y( @& W$ D: b6 o
      break;; t0 ?, A+ h* H8 o7 _( Y2 w) \4 V+ a
    }
- |4 l& K- u6 P7 ?% S5 m    cout<<"网卡MAC地址:";+ g3 A; f3 n! A
    for (DWORD i = 0; i < pIpAdapterInfo->AddressLength; i++)
+ A8 g. Z0 {6 R0 o) t- b      if (i < pIpAdapterInfo->AddressLength-1)
6 H& ~  [  G9 N& l7 E/ j' V      {
6 w# P0 W5 M& t2 j' b' k        printf("%02X-", pIpAdapterInfo->Address);3 o7 C/ f2 s6 ~7 T
      }
+ n8 V# w" j6 ?      else" L4 S/ \3 }" z) U+ O
      {
+ K/ Y1 p1 }- b: ]  J9 v) P8 o        printf("%02X\n", pIpAdapterInfo->Address);
% c0 @) O6 S1 r/ a      }
1 C/ _  b7 X2 o+ n9 m5 C5 N+ K      cout<<"网卡IP地址如下:"<<endl;
; F& X2 W' F; W! a      //可能网卡有多IP,因此通过循环去判断
; I/ e, m3 Q, _5 D* M      IP_ADDR_STRING *pIpAddrString =&(pIpAdapterInfo->IpAddressList);6 Z- h- m3 A; L# Z
      do
! G, h9 i4 I, X2 M* T9 i      {
; o9 h" G) M9 d  H. }        cout<<"该网卡上的IP数量:"<<++IPnumPerNetCard<<endl;; N: |: n3 H, ~9 r* }/ Q
        cout<<"IP 地址:"<<pIpAddrString->IpAddress.String<<endl;
; Q/ T; {! E4 v" p, C        cout<<"子网地址:"<<pIpAddrString->IpMask.String<<endl;
! k% I. ]& U4 M5 Z$ |& j1 A        cout<<"网关地址:"<<pIpAdapterInfo->GatewayList.IpAddress.String<<endl;
! K+ i$ X+ F4 }/ k. ~        pIpAddrString=pIpAddrString->Next;
# h* G5 P- N) s2 J6 h* A% i      } while (pIpAddrString);
  ?- D+ w8 _6 u  Z. {      pIpAdapterInfo = pIpAdapterInfo->Next;' x1 ?5 M& ~/ \% a" \. u
      cout<<"--------------------------------------------------------------------"<<endl;6 V4 ~, |5 D' k; x. z3 ]7 x
  }
4 O  o: y' W) K9 g   
# w  M4 @* y4 o, L$ z# o  }
0 i! ]1 ], B! b: T( v$ u# V  //释放内存空间( w/ w, r6 C% _  P
  if (pIpAdapterInfo)3 ]& |9 g' D4 `+ k9 I% _/ L
  {0 R/ Q) H8 s" L! {0 E
    delete pIpAdapterInfo;
- s3 o) ]& a" G/ P+ y& V/ {  }
, B* }; U2 z6 e( P7 Y  
& s$ `9 o; I: U  return 0;; h9 A$ w* _) b, D
}
) Q- z! T6 D7 K# Z7 e8 ~  \0 u4 I* j; j; q. B8 z( [( L+ ?
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 www.doteam.tech
回复

使用道具 举报

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

本版积分规则

在本版发帖
关注公众号
QQ客服返回顶部