查看: 3763|回复: 0

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

[复制链接]

4

主题

3

回帖

38

积分

管理员

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

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

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

×
#include <WinSock2.h>8 F8 K/ Q8 T1 X3 g  l3 {
#include <Iphlpapi.h>2 r* Q: f' r. W  {/ G
#include <iostream>
5 Z2 b* U. u( S9 susing namespace std;
2 M/ B7 Q0 f$ z( A1 h! I5 q#pragma comment(lib,"Iphlpapi.lib") //需要添加Iphlpapi.lib库( w# B7 O" G; E9 K* }- m* g

/ o6 ]" Y' b! m2 f- r4 W, pint main(int argc, char* argv[])
) i( f- ~7 Y8 Q$ y{( Q9 _& F0 Z$ O; C* L* I% V
  //PIP_ADAPTER_INFO结构体指针存储本机网卡信息6 d- W1 F8 o2 j' E' S; u8 N! U1 d
  PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO();
  b) @5 s5 W" |! U  //得到结构体大小,用于GetAdaptersInfo参数0 _! E0 u6 ^# D+ i2 {% g( t
  unsigned long stSize = sizeof(IP_ADAPTER_INFO);# |# o( ?/ B8 a
  //调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量;其中stSize参数既是一个输入量也是一个输出量& [' g/ Z) j2 C# K, H7 v% Q
  int nRel = GetAdaptersInfo(pIpAdapterInfo,&stSize);4 r7 i7 y. Q5 {& s( U, h3 E
  //记录网卡数量
; M# i! e3 y% E  int neTCardNum = 0;
- L: x  J! m0 C) Y7 v  m/ n  //记录每张网卡上的IP地址数量: I, ^) q- X( F( K' e8 S
  int IPnumPerNetCard = 0;# ?- _8 A% _% C0 L0 x4 x
  if (ERROR_BUFFER_OVERFLOW == nRel): Y5 v' J" J/ x: c* [/ J; y
  {9 G2 ]0 ^* f& d
    //如果函数返回的是ERROR_BUFFER_OVERFLOW
6 j; `6 L3 Z" j; H) m    //则说明GetAdaptersInfo参数传递的内存空间不够,同时其传出stSize,表示需要的空间大小1 g* g& f4 T9 a6 ^! D5 }; z
    //这也是说明为什么stSize既是一个输入量也是一个输出量
" u3 j; `$ t4 `. w) n! Y  K$ p* w    //释放原来的内存空间
9 z6 ^& ?. J0 B5 E0 Q, I9 P    delete pIpAdapterInfo;
% L. Y- E0 c, r& O9 n- P    //重新申请内存空间用来存储所有网卡信息) Z/ I  E* m$ T& l# J
    pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize];
3 p3 G6 A1 b" I# T0 P2 H) J7 D- ]7 g    //再次调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量
. h3 G1 n8 j8 H  Z3 e) _    nRel=GetAdaptersInfo(pIpAdapterInfo,&stSize);  
) X7 `9 V) r3 r7 n# @  }
! e, W* W0 c. P. h8 D  if (ERROR_SUCCESS == nRel)& }8 P' `# X+ }# m/ ^
  {, L. X- M" ^) t3 T1 ^& N  s. k
    //输出网卡信息' D9 _' j3 n1 t3 r* K% q( I$ z
     //可能有多网卡,因此通过循环去判断0 Y5 n: O0 f& f
  while (pIpAdapterInfo)3 v' x; S' R! f5 A- V
  {
" p/ j% {0 Q& E3 I7 U* i* s& M5 l! u    cout<<"网卡数量:"<<++netCardNum<<endl;% P2 t; a, d: A- |/ g3 E
    cout<<"网卡名称:"<<pIpAdapterInfo->AdapterName<<endl;4 V9 S7 \/ S5 ]; p6 }9 J3 D; E
    cout<<"网卡描述:"<<pIpAdapterInfo->Description<<endl;
* x1 u- t* S+ C: d2 m' h    switch(pIpAdapterInfo->Type)
6 E' v5 L- F# d8 U/ t1 _5 g    {# h& [# R$ X+ _' Q- a. j* M
    case MIB_IF_TYPE_OTHER:
+ J; C! x* f) [; E. k      cout<<"网卡类型:"<<"OTHER"<<endl;
$ D7 b7 j& T9 y9 h      break;
) |' y. L" Z* p# t9 [    case MIB_IF_TYPE_ETHERNET:& S0 C. W# ]/ r) n$ ^- ]& t
      cout<<"网卡类型:"<<"ETHERNET"<<endl;3 L9 b3 p8 e2 Q# \9 s
      break;
6 G9 K# a9 i9 G    case MIB_IF_TYPE_TOKENRING:
  x- s4 J$ @5 h, j9 \- h8 C" M      cout<<"网卡类型:"<<"TOKENRING"<<endl;5 h: k- k1 k; Y2 u& q
      break;0 k/ E6 t* }4 v3 ~' d
    case MIB_IF_TYPE_FDDI:$ h& |/ r6 v4 s- @  [/ O& b
      cout<<"网卡类型:"<<"FDDI"<<endl;
1 j+ l& t0 [) ]0 S, g! Q8 B      break;- m, V" j* j9 y4 H) d' c9 d
    case MIB_IF_TYPE_PPP:' H$ J- H* ~! u% D% B$ |
      printf("PP\n");
: I$ P: G# Y  ?2 Z5 n) h      cout<<"网卡类型:"<<"PPP"<<endl;) \2 t: U8 V9 {; t
      break;  Y7 q# j1 M. ^7 I( a
    case MIB_IF_TYPE_LOOPBACK:% b' `; R: Z( @+ P3 E
      cout<<"网卡类型:"<<"LOOPBACK"<<endl;5 M1 J" ]; g6 ~8 a* b1 c) ~$ |
      break;
% n& l3 U. ?0 M6 x( Y; D    case MIB_IF_TYPE_SLIP:9 ^9 N0 y/ H( z! Y# `* d; n/ Q0 n
      cout<<"网卡类型:"<<"SLIP"<<endl;
9 I8 k/ N) F# r0 V      break;! U4 `0 e+ ^& I' W. K
    default:: B; Q& [5 i3 f7 m

4 [% _/ G9 k/ Z/ C      break;
6 b& U+ x- b+ @6 @    }3 w6 J) F% S( P: n6 G1 g0 a3 \% h( }
    cout<<"网卡MAC地址:";) V/ J; Q6 e8 O: s+ K9 u
    for (DWORD i = 0; i < pIpAdapterInfo->AddressLength; i++)5 F; Y# {+ ]9 u* t/ w
      if (i < pIpAdapterInfo->AddressLength-1)1 i: `' O* ^" {) D# `6 P9 `) ]
      {
) X' U% o# N) N# b, m        printf("%02X-", pIpAdapterInfo->Address);
0 b; u6 n- ]: c' o5 I/ j      }
/ G- S( K3 L+ h  M  d8 p      else/ u) T0 f5 M& W* D& c
      {( n6 P/ @; `8 k" M% J5 a& u
        printf("%02X\n", pIpAdapterInfo->Address);
; q% I5 \: T4 A# x6 |: |      }' k& a. \1 d# o
      cout<<"网卡IP地址如下:"<<endl;
, y7 Z0 P& _+ m, G) ?$ P      //可能网卡有多IP,因此通过循环去判断
' [6 K8 @! I+ ?- u9 t$ I      IP_ADDR_STRING *pIpAddrString =&(pIpAdapterInfo->IpAddressList);) W0 }4 r4 z6 M
      do' b0 I1 K+ @& I/ U; ~/ f# |
      {
% a& l1 C9 g! E) }) H        cout<<"该网卡上的IP数量:"<<++IPnumPerNetCard<<endl;
" g( v) L5 ^+ c* M$ S        cout<<"IP 地址:"<<pIpAddrString->IpAddress.String<<endl;& A4 g8 Q+ ^8 ~: ^
        cout<<"子网地址:"<<pIpAddrString->IpMask.String<<endl;
$ a. F, o! A9 `& J7 n5 M        cout<<"网关地址:"<<pIpAdapterInfo->GatewayList.IpAddress.String<<endl;
0 G$ z$ l  ?- u2 S  T        pIpAddrString=pIpAddrString->Next;- j' M6 L. H) c9 B1 ?% \! v2 J
      } while (pIpAddrString);, b8 s( g( _2 y! V3 i# h% u
      pIpAdapterInfo = pIpAdapterInfo->Next;
4 R& s' w% ]! ~8 o# E) \      cout<<"--------------------------------------------------------------------"<<endl;6 ]* `) H. g, O/ q8 ~
  }* d% x9 e- A0 d2 h* r( X) g1 c5 I
   
, W7 p) g8 G2 E- I% E2 s  }
7 {  l: w( B5 e) y  //释放内存空间
$ L- h  C0 D9 e. l* {2 T8 w  if (pIpAdapterInfo)2 Y- L! W3 v2 m4 k( O5 L' d
  {
  L" ]' V! i3 Z  H# B! a    delete pIpAdapterInfo;' L* s3 X' [2 E; ?
  }0 z# u7 [4 o; r
  * L% U/ F1 i! h
  return 0;3 V& Z$ D2 a: ~" k! y  O: T0 Y
}$ C. v2 p/ t2 |( z

" ]7 z6 W3 a# y. h% G! t
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 www.doteam.tech
回复

使用道具 举报

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

本版积分规则

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