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

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

[复制链接]

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

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

admin 楼主

2017-10-17 21:05:45

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

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

x
#include <WinSock2.h>$ I" n4 w# y) |& F5 i& x
#include <Iphlpapi.h>6 E% A/ ~/ ]4 p* s1 j
#include <iostream>
/ l! q* A$ P  u2 iusing namespace std;
: S1 i1 y5 Q( s' G#pragma comment(lib,"Iphlpapi.lib") //需要添加Iphlpapi.lib库
  g: x3 \* ^, J$ f. y
% m3 v4 E8 l' |int main(int argc, char* argv[])
1 H; `! J/ X0 N& w6 P0 O  i& s{8 Q( J5 _9 E! I" x1 T- M7 q
  //PIP_ADAPTER_INFO结构体指针存储本机网卡信息
* a* g1 b2 u! K4 r3 `7 Q4 C- ^  PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO();
& ^/ ?+ r; @. M/ B3 t  //得到结构体大小,用于GetAdaptersInfo参数
) ^3 c0 d3 i" `; f4 r2 u, z5 B2 @  unsigned long stSize = sizeof(IP_ADAPTER_INFO);; p4 P4 p( C/ [2 E1 ]& i9 f+ H* r
  //调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量;其中stSize参数既是一个输入量也是一个输出量
: w& Z) y# d  w" V6 K  int nRel = GetAdaptersInfo(pIpAdapterInfo,&stSize);
0 u- V! u; u* M  //记录网卡数量, A6 H& o6 M  U! [- R6 _. A
  int neTCardNum = 0;
! ]$ S$ v8 j9 }+ w! z  //记录每张网卡上的IP地址数量1 u! c6 _7 `+ @
  int IPnumPerNetCard = 0;( b7 q5 Q& V$ H* u& P6 `
  if (ERROR_BUFFER_OVERFLOW == nRel)4 L, [/ P/ P+ P% z" M  L8 J: s
  {
$ u4 l0 R( K" n  V/ V: n    //如果函数返回的是ERROR_BUFFER_OVERFLOW  {* P6 f% A- ^% V! r7 g; d; y& D1 ?
    //则说明GetAdaptersInfo参数传递的内存空间不够,同时其传出stSize,表示需要的空间大小. g+ I( r, l; B" ~
    //这也是说明为什么stSize既是一个输入量也是一个输出量
* A2 J& O8 G3 k, C5 u8 W    //释放原来的内存空间# a! V9 Y* e4 T6 \# D2 f: V
    delete pIpAdapterInfo;
) `  P1 c/ i3 x. H. M8 r    //重新申请内存空间用来存储所有网卡信息
7 i5 D# V8 ]) r9 O8 @3 Q) [9 s    pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize];
4 G# o' v- F: b* a( [4 M    //再次调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量: X* f$ @/ p, d' @
    nRel=GetAdaptersInfo(pIpAdapterInfo,&stSize);  ! f! F' X7 _2 e; M, D' X0 `  U  B( B
  }
: |0 O5 V3 M- Y; _# F6 X. B7 M, k  if (ERROR_SUCCESS == nRel)
7 o# d  [# [/ g3 y  {
( x6 n9 c* [8 X( Y/ Q7 Q3 G    //输出网卡信息, @" W$ g3 Q3 I- j
     //可能有多网卡,因此通过循环去判断# H6 b6 U' m0 b! z
  while (pIpAdapterInfo)
8 Z' G, ~5 B, o( ]% H; V  {! }: I6 {5 ]% f# `( q
    cout<<"网卡数量:"<<++netCardNum<<endl;3 c7 R' A$ S1 v
    cout<<"网卡名称:"<<pIpAdapterInfo->AdapterName<<endl;
: c& k+ O( o! Y9 V2 e    cout<<"网卡描述:"<<pIpAdapterInfo->Description<<endl;
! ?) j  a5 {# w3 g* ^    switch(pIpAdapterInfo->Type)
5 k: K  c9 h. J2 s+ ?    {! @( d* M# a' B1 S- [# c
    case MIB_IF_TYPE_OTHER:
9 Z4 e4 {% p$ ], B8 e      cout<<"网卡类型:"<<"OTHER"<<endl;) r7 ]. J: X5 D" S* `# P
      break;
, D5 b/ z$ w. N+ E0 I    case MIB_IF_TYPE_ETHERNET:
- N$ V8 j- ]& a; F" }- k! }& X      cout<<"网卡类型:"<<"ETHERNET"<<endl;
+ X  a, o8 N1 a, R5 g8 z) L      break;5 X4 v% Z: v/ c5 Q  P
    case MIB_IF_TYPE_TOKENRING:
  d7 D  f* u8 c# A+ q      cout<<"网卡类型:"<<"TOKENRING"<<endl;
& g. ], v" T7 T) k& \' q# ^: Z$ Q      break;: \! A9 m% J) g# L) w
    case MIB_IF_TYPE_FDDI:
) ^% \  o- R& `5 F2 e, e      cout<<"网卡类型:"<<"FDDI"<<endl;
' @& h0 Q, [' r6 ?+ W% E5 q      break;
7 \8 }& c( V- w2 r    case MIB_IF_TYPE_PPP:
8 H7 O0 [: h* V' x      printf("PP\n");
" N' a5 L9 C) a% L1 W      cout<<"网卡类型:"<<"PPP"<<endl;; J) m0 ^3 H6 y- n- {+ v
      break;
4 o- Q# a( X. b    case MIB_IF_TYPE_LOOPBACK:& f% B# r/ B* t! \( q
      cout<<"网卡类型:"<<"LOOPBACK"<<endl;
. u/ @" Z* _+ @0 x      break;' v6 b* I  d, n+ A. s
    case MIB_IF_TYPE_SLIP:# j0 ?! J8 d% a& J5 e$ e
      cout<<"网卡类型:"<<"SLIP"<<endl;+ `- g* e( p, R! X( F. G
      break;1 v% Z) r/ j$ ~- |: H
    default:% ~6 v, I/ g9 e4 H, o6 w+ K( V

. O: }+ Y" o* f  W" O      break;; f5 i7 \( m7 b" s( e& b
    }; t' M5 f2 A1 |# X9 Q1 I
    cout<<"网卡MAC地址:";
5 s; K3 T9 b  _! H$ Y4 ]    for (DWORD i = 0; i < pIpAdapterInfo->AddressLength; i++)
7 d/ z- z3 {; e  L+ y      if (i < pIpAdapterInfo->AddressLength-1)% N. Z  E" X% R( a
      {
$ \% @# ?' d  O* p4 O" m        printf("%02X-", pIpAdapterInfo->Address);
$ f4 ^4 C% K6 v. H. ]. F, m& L      }
; G9 j* U& u4 t3 o      else
, ?* K6 w; ]% ^& T' z- q& Y& b# W3 ]      {- U9 [% P; [/ Z6 d
        printf("%02X\n", pIpAdapterInfo->Address);
+ F/ ]* Y5 |: o      }; s1 p7 R* Q0 p7 J. ]: I% j; E+ Q0 g
      cout<<"网卡IP地址如下:"<<endl;
% l& I& Q% Q: ^7 w- U. U( L      //可能网卡有多IP,因此通过循环去判断
5 i5 @! i6 u/ {0 H+ y      IP_ADDR_STRING *pIpAddrString =&(pIpAdapterInfo->IpAddressList);  n' t+ g) A4 Z8 M
      do3 v9 Q: i' g/ }8 K. f
      {
9 ]+ I8 M6 s; E0 H        cout<<"该网卡上的IP数量:"<<++IPnumPerNetCard<<endl;  l2 r  l8 @% C. \  K  ]6 b4 L
        cout<<"IP 地址:"<<pIpAddrString->IpAddress.String<<endl;
9 b9 A: l: t8 L( K0 [        cout<<"子网地址:"<<pIpAddrString->IpMask.String<<endl;# y) [$ r+ w/ l+ `
        cout<<"网关地址:"<<pIpAdapterInfo->GatewayList.IpAddress.String<<endl;
4 P7 o) t: T( `! H% E        pIpAddrString=pIpAddrString->Next;
8 u" r, g/ n3 _: M0 _      } while (pIpAddrString);
. v+ x/ G6 x2 i; W( F# M9 k      pIpAdapterInfo = pIpAdapterInfo->Next;' |( h9 s' N0 c8 U; u
      cout<<"--------------------------------------------------------------------"<<endl;
2 l. ?" ?- Q- M2 A- t/ |5 _+ F  }" c8 V% r( {$ Q
   
& S+ L& M3 |9 F- W  }7 T6 {' E- X4 X8 B& t2 u0 n
  //释放内存空间
% I: p' v/ ?0 O& ?  Y  if (pIpAdapterInfo)
* {; G: M* i7 ]* I4 I1 P% {  {
$ k0 P4 e) J  P3 g5 J' J6 H    delete pIpAdapterInfo;
4 S7 o& ]3 g8 j+ c  }
, C; d3 H2 H1 ?6 V! J' ?  ' R* Q% @2 S+ Q6 m( ~# ~  E9 m3 Z$ ?* k
  return 0;
! X6 ?/ v& z# z6 g/ o6 t}
) S4 M* X5 J" ?/ g! J: q. Z( s  M$ h- f0 @% G( z/ C
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了