查看: 3872|回复: 0

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

[复制链接]

6

主题

4

回帖

60

积分

管理员

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

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

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

×
#include <WinSock2.h>
( H. Z; u- o0 B. f9 x2 ]/ W! p#include <Iphlpapi.h>5 h7 s0 o" g7 J6 U0 Q7 g4 m+ N
#include <iostream>
& v, g1 P  x# ^1 e6 E! E, pusing namespace std;
0 U$ d6 T* I$ S9 S# `4 o/ ]#pragma comment(lib,"Iphlpapi.lib") //需要添加Iphlpapi.lib库7 {4 s  ~* o7 Z2 |/ g7 u

; \# Y8 J- Z7 d/ Jint main(int argc, char* argv[]). k& X9 ~+ x+ v2 H2 |
{9 q9 D9 C8 A; H6 v* }+ j9 {# b& q
  //PIP_ADAPTER_INFO结构体指针存储本机网卡信息
5 I. q1 Z" n  P3 M! w  PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO();6 Y' Y9 \, m1 [1 u+ I  E8 q
  //得到结构体大小,用于GetAdaptersInfo参数! }  a( ?# m( }6 \8 v' h) x7 j
  unsigned long stSize = sizeof(IP_ADAPTER_INFO);
+ }+ K1 n& \! F, ^  ]2 _  //调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量;其中stSize参数既是一个输入量也是一个输出量4 l' E& \; `* f( ~+ }* J
  int nRel = GetAdaptersInfo(pIpAdapterInfo,&stSize);
+ G" N1 W4 z  S  //记录网卡数量
# D9 ]0 T6 X1 p( u4 ]& G  int neTCardNum = 0;$ G  s: l) X2 C8 t, n; X6 {% d
  //记录每张网卡上的IP地址数量3 s  I- }' [/ c2 L7 b# D/ \
  int IPnumPerNetCard = 0;
# ?" m; r: L& ~- a3 V+ ?  if (ERROR_BUFFER_OVERFLOW == nRel)
8 F3 o) K$ f$ U  {+ i6 O( Z0 l0 \  @' w: G( @$ @
    //如果函数返回的是ERROR_BUFFER_OVERFLOW
0 u' ?' }0 y+ N% Y( b: O1 E. i# w    //则说明GetAdaptersInfo参数传递的内存空间不够,同时其传出stSize,表示需要的空间大小+ X3 D* W# G! Z
    //这也是说明为什么stSize既是一个输入量也是一个输出量& {4 a( G( l( A% |+ B
    //释放原来的内存空间& Q0 C% g, M/ X+ ]( |, [
    delete pIpAdapterInfo;$ h- `+ l1 N6 g1 G$ g& m- g
    //重新申请内存空间用来存储所有网卡信息
' m; S. M2 O' }    pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize];/ }: N" Q( k, f: w
    //再次调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量
& Q4 A8 C# ?+ q8 t6 P    nRel=GetAdaptersInfo(pIpAdapterInfo,&stSize);  - z. ?) t5 c$ x, r
  }
( @  V$ G& v% o$ A) o5 j# e/ c  if (ERROR_SUCCESS == nRel)
% C) E  I- `- T' j# o  {
5 D, w: _! i8 \8 Z    //输出网卡信息
% E8 I; m3 d1 _6 ^6 a3 D' c     //可能有多网卡,因此通过循环去判断
& h8 [' j4 l* U0 ~: [! k  while (pIpAdapterInfo)$ D2 Z' B" c- N6 J$ i2 u" Q
  {, ~9 o8 |! h* A/ V9 j, E
    cout<<"网卡数量:"<<++netCardNum<<endl;
. _2 R# L! v$ u    cout<<"网卡名称:"<<pIpAdapterInfo->AdapterName<<endl;
* ~2 O" V( G' i6 Q- Y2 G1 u    cout<<"网卡描述:"<<pIpAdapterInfo->Description<<endl;, z. j. o+ O; {# a' Z
    switch(pIpAdapterInfo->Type)+ F  F7 y- f$ ?! U6 p
    {& c$ u$ @2 d( A6 I0 M! t/ B2 ?$ F
    case MIB_IF_TYPE_OTHER:  c2 f. i; R$ j% h
      cout<<"网卡类型:"<<"OTHER"<<endl;3 t3 e  F- A% A5 ^
      break;' e* a' {/ q$ Q* u; J
    case MIB_IF_TYPE_ETHERNET:6 u' p- l  E$ U# T2 j) Z2 m3 A
      cout<<"网卡类型:"<<"ETHERNET"<<endl;
+ c6 I* Q1 X# j! M& L! T* x      break;
- K4 \/ G1 y! i$ M- N) O( U% f    case MIB_IF_TYPE_TOKENRING:
) h9 n& l$ t. }+ u7 z& {; N# N9 t$ W$ W      cout<<"网卡类型:"<<"TOKENRING"<<endl;) S+ Z- `) i5 p% w& m+ b3 h) G
      break;, f) }0 U$ ~' V! v: b/ e& R
    case MIB_IF_TYPE_FDDI:" v! G# Q8 T5 f$ l; X
      cout<<"网卡类型:"<<"FDDI"<<endl;8 S3 C; o+ a6 s+ n% w4 G  a
      break;, ]- E- X3 I6 |
    case MIB_IF_TYPE_PPP:
! t5 _: w9 H7 E4 l      printf("PP\n");
1 z; j8 \$ l. c& q: |" Z! Z+ k      cout<<"网卡类型:"<<"PPP"<<endl;
; C7 h4 c6 X- B* H" j' h      break;
1 ?6 x7 A5 H0 Q6 ~6 i7 H3 O: K    case MIB_IF_TYPE_LOOPBACK:
/ @2 _$ S3 ^+ ^      cout<<"网卡类型:"<<"LOOPBACK"<<endl;
7 S/ w* B3 |! ~/ S! P      break;# `# }: F; u/ ~, N- }% ]+ H9 f/ ^
    case MIB_IF_TYPE_SLIP:9 M1 w/ M/ }1 |7 D" [6 ~$ S
      cout<<"网卡类型:"<<"SLIP"<<endl;
2 g; W8 h; t% V6 F4 _      break;8 N* V" v, q7 V- N# i
    default:
) q# F7 M9 V- J* n# Y+ {
$ X, k' q, I) V! `: F9 y5 Q      break;
1 b  ?+ O: \) q( O5 z4 t    }
: i6 d  m  P, \# N! u/ N    cout<<"网卡MAC地址:";  j  Q0 b' k1 I( K$ k
    for (DWORD i = 0; i < pIpAdapterInfo->AddressLength; i++)
9 g" _6 J' m; I- A      if (i < pIpAdapterInfo->AddressLength-1)1 q# x* g" p! a6 v; O3 e4 [1 q) o
      {
- r' \1 m/ o) R6 G# S8 A2 R1 ~- y9 T        printf("%02X-", pIpAdapterInfo->Address);0 q& |: d- h0 k2 T9 ~( r  `
      }  o* u$ w: @# l9 ^: r- {4 c4 f
      else) J' w% r; f- M8 j: l* R
      {: i' }4 r2 k6 }
        printf("%02X\n", pIpAdapterInfo->Address);
; p6 N9 P( w/ K      }
' D$ P: j, b- {- h3 Z: N5 L      cout<<"网卡IP地址如下:"<<endl;9 @9 z" _! X6 _5 |9 P: r
      //可能网卡有多IP,因此通过循环去判断, c5 C3 f; M0 d, u' O) }. s
      IP_ADDR_STRING *pIpAddrString =&(pIpAdapterInfo->IpAddressList);
6 q6 T$ [$ L1 r# V9 }0 p! ^9 W      do: I7 R4 b# z; a) s6 r: g
      {' N6 T* J) K7 J7 C/ y
        cout<<"该网卡上的IP数量:"<<++IPnumPerNetCard<<endl;
9 `. B$ H7 S" N5 f. }! H* b        cout<<"IP 地址:"<<pIpAddrString->IpAddress.String<<endl;5 U' R) u0 b" K7 n
        cout<<"子网地址:"<<pIpAddrString->IpMask.String<<endl;5 i0 g' E* w. Y1 }6 h
        cout<<"网关地址:"<<pIpAdapterInfo->GatewayList.IpAddress.String<<endl;
% C8 z3 r9 a7 H+ X& C( N/ ]        pIpAddrString=pIpAddrString->Next;
3 c; ?  x' D7 Y& d+ K3 w      } while (pIpAddrString);* H5 j$ X0 b% H
      pIpAdapterInfo = pIpAdapterInfo->Next;' o, k) V& w* R" [
      cout<<"--------------------------------------------------------------------"<<endl;% [. q4 j2 G5 P6 S3 R6 f
  }
9 Z7 o" K% h  H5 e0 u   
) T. Q4 M4 ^/ Q. ?; s  }% A0 Y; K% T7 r/ a; z2 c8 T% ?: u
  //释放内存空间5 F$ W% t+ J/ g  y4 b2 y
  if (pIpAdapterInfo)
+ e$ s( ~( {! \2 {& |  {5 r: w% k7 Z5 \" ?# x" m( R
    delete pIpAdapterInfo;
* W5 u" X+ l% G$ o  }
( i5 V! t6 N9 O7 u# v  ! A2 y3 G0 g& P+ q5 w
  return 0;+ m& r% f4 J- w# p2 o: [% W7 m) o
}  g' d$ v) B& F# e
; |; U5 `( h% ^3 O& A, k
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 www.doteam.tech
回复

使用道具 举报

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

本版积分规则

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