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

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

[复制链接]

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

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

admin 楼主

2017-10-17 21:05:45

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

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

x
#include <WinSock2.h>, b5 r% R9 ]( D( B- v( D3 z
#include <Iphlpapi.h>3 \& T9 Y* w: I$ H/ E
#include <iostream>0 s* q& P  ?( Q
using namespace std;
; D2 R$ k- f: Z: l' e' {! p8 ?#pragma comment(lib,"Iphlpapi.lib") //需要添加Iphlpapi.lib库
4 t  \7 P' z* p/ U% R2 ^9 y9 s
8 E, l7 H8 q4 W# E- Eint main(int argc, char* argv[])8 k# u+ |/ |9 c: R: _
{% k$ ^& X" r2 N. a& H2 U6 ]% ?" M
  //PIP_ADAPTER_INFO结构体指针存储本机网卡信息$ r& u& D7 {, k/ U/ T  @4 w
  PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO();
) V8 @* Q" J$ S2 i+ [; g0 {, E$ t- t  //得到结构体大小,用于GetAdaptersInfo参数
" v) b1 x$ i" e3 n  unsigned long stSize = sizeof(IP_ADAPTER_INFO);% U% x5 ~# @+ P! ^1 U
  //调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量;其中stSize参数既是一个输入量也是一个输出量9 y- S/ c: S% V0 o6 V+ J
  int nRel = GetAdaptersInfo(pIpAdapterInfo,&stSize);
& p% V( H4 l" i$ i# ^' g3 l- F  //记录网卡数量/ w4 a! n7 l( B. ?! s
  int neTCardNum = 0;$ D6 L* w& L- N
  //记录每张网卡上的IP地址数量; g, X4 C3 N6 Y4 o! ~& \9 k
  int IPnumPerNetCard = 0;
5 |, U# }3 N* c* G5 A6 b" f; z3 e  if (ERROR_BUFFER_OVERFLOW == nRel)1 s( L) y5 I5 T
  {6 g; d; j3 }% X, }6 T: [& _
    //如果函数返回的是ERROR_BUFFER_OVERFLOW9 }1 x9 G6 ^3 J% I& N: V4 n
    //则说明GetAdaptersInfo参数传递的内存空间不够,同时其传出stSize,表示需要的空间大小* l9 n+ s3 X6 v, q8 S
    //这也是说明为什么stSize既是一个输入量也是一个输出量
; ]+ [, _, e/ J! l# A" T, ?4 K9 x. _0 P    //释放原来的内存空间
8 F! Y  a7 n$ d% v: u    delete pIpAdapterInfo;& p9 E4 ^  z7 I1 Q' @
    //重新申请内存空间用来存储所有网卡信息% r) a8 K: D: P5 g5 {
    pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize];" l" _) g9 S" T6 O
    //再次调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量
( O* T% b) u% }) H    nRel=GetAdaptersInfo(pIpAdapterInfo,&stSize);  
* {0 D& d( R2 c' f  }( b. a) v/ e# T
  if (ERROR_SUCCESS == nRel)
. v, ?( w- g+ N  V% \  {0 ]: K* d4 k" f( \. p4 k
    //输出网卡信息7 s1 D" v& ~% D( m
     //可能有多网卡,因此通过循环去判断
# f8 i" X" }& @' k" n  while (pIpAdapterInfo)) y8 X$ v6 H. t
  {; _, Y6 c- E7 d+ p& c
    cout<<"网卡数量:"<<++netCardNum<<endl;
1 Y% j( h$ b1 D8 W9 [    cout<<"网卡名称:"<<pIpAdapterInfo->AdapterName<<endl;
: b9 Q# X* J- u0 F+ S. \8 t    cout<<"网卡描述:"<<pIpAdapterInfo->Description<<endl;! q+ d" k# Y; z! L. P5 L
    switch(pIpAdapterInfo->Type)% Q* q! s( N7 L/ S
    {, u2 F. G1 r$ Q8 p  G2 L7 f
    case MIB_IF_TYPE_OTHER:5 {8 U' h# v6 Y, O1 K" X
      cout<<"网卡类型:"<<"OTHER"<<endl;
4 b- S: p) m* ~8 ~6 q6 D      break;" i* b# r" g: N- Y" e2 o
    case MIB_IF_TYPE_ETHERNET:4 g, t* S8 F5 e
      cout<<"网卡类型:"<<"ETHERNET"<<endl;
6 x4 |* X% N5 P8 n- D# K      break;
3 v' K& \8 m- K3 r6 B1 o. t2 @    case MIB_IF_TYPE_TOKENRING:( {( b& U% x8 Z* l6 X' |
      cout<<"网卡类型:"<<"TOKENRING"<<endl;( V# }9 m5 U# l% K
      break;8 |- [1 l3 y' Z- Z. N% L: q) g
    case MIB_IF_TYPE_FDDI:
. J: R$ Z( n! A      cout<<"网卡类型:"<<"FDDI"<<endl;8 p& D; g: Q; [! b0 m; `+ }
      break;
, l2 o3 U0 b) O7 h1 k1 k0 Y    case MIB_IF_TYPE_PPP:1 w  l, b4 e! V
      printf("PP\n");
. z  b9 w$ c8 j  ]3 S6 U  B      cout<<"网卡类型:"<<"PPP"<<endl;
' ~$ v9 z$ n( s% f      break;
3 l- n# ?. @! o6 M, y    case MIB_IF_TYPE_LOOPBACK:
! @2 g1 C1 k% z# c# m      cout<<"网卡类型:"<<"LOOPBACK"<<endl;
9 K; d& P% n5 G- h& S      break;
! b' P* R, \' a    case MIB_IF_TYPE_SLIP:
! f# P! p, n, @+ |" T" C; `      cout<<"网卡类型:"<<"SLIP"<<endl;
; v8 B9 ]! E1 N: a      break;
. p3 U9 }$ e; B, ?- \8 B3 m    default:
! H) h7 k9 i+ X8 x7 a( ^! v  d) o  G8 Q7 n$ a; L) _' e
      break;
, [+ A& N1 {; a! I+ Z( W7 Y    }$ ]4 C8 K+ S$ E/ \4 c
    cout<<"网卡MAC地址:";) V! _( O( o5 j* U' c: h1 e' P+ ]8 x) l
    for (DWORD i = 0; i < pIpAdapterInfo->AddressLength; i++)
$ `$ y$ s; w8 E4 F      if (i < pIpAdapterInfo->AddressLength-1)4 I9 E3 }8 t5 j, `# G
      {% F1 {$ `9 s: E, j6 W
        printf("%02X-", pIpAdapterInfo->Address);0 t% A3 `3 {3 d- J% }' N
      }
& s: V8 b: K7 A' M8 ?. @+ C      else0 X& [$ J; G! r5 D! r) p' u( s' K
      {
0 P. f  e: E5 @5 z7 Y( o# Y, j4 Y0 t        printf("%02X\n", pIpAdapterInfo->Address);
2 o6 E3 A0 e) U- x. h2 j3 \      }, l" X" P4 z+ S: Z" R( s( r
      cout<<"网卡IP地址如下:"<<endl;4 c; Y+ r0 I5 F" X2 _' d
      //可能网卡有多IP,因此通过循环去判断
! ~. p( C2 E/ \9 b- l: y0 ~# l6 m      IP_ADDR_STRING *pIpAddrString =&(pIpAdapterInfo->IpAddressList);
: @* g. x( ]7 w* w8 h* A7 s# h9 {      do1 U8 d3 z5 R2 J
      {- K0 l* K5 a1 G' a
        cout<<"该网卡上的IP数量:"<<++IPnumPerNetCard<<endl;
/ [3 ]2 U$ y9 K8 y1 J2 K        cout<<"IP 地址:"<<pIpAddrString->IpAddress.String<<endl;6 F+ |$ `6 t0 T# `7 ^6 ~- M
        cout<<"子网地址:"<<pIpAddrString->IpMask.String<<endl;6 B, q: r5 x2 p
        cout<<"网关地址:"<<pIpAdapterInfo->GatewayList.IpAddress.String<<endl;& ]0 R- ^& M0 N
        pIpAddrString=pIpAddrString->Next;3 c( U0 a8 a5 s
      } while (pIpAddrString);
3 l$ x, Z$ q# _7 ]0 b8 ?# F      pIpAdapterInfo = pIpAdapterInfo->Next;
1 K$ T1 }7 t% y6 K; k$ t      cout<<"--------------------------------------------------------------------"<<endl;  `1 [5 E! o, J" h/ A" s/ u
  }
$ K% T: m) W* {/ }: R   4 l0 {8 S6 W- p0 _: ]
  }
& U& e5 ?  L' x1 ^- V4 `  //释放内存空间, m; C8 L9 v1 Z
  if (pIpAdapterInfo)
( M# R8 M7 i/ m- Z6 R) e2 e% k  {
/ F6 a) X1 g/ K4 Z    delete pIpAdapterInfo;
% O) M" s2 [  U( L+ F6 r& E  }
- v1 ~; L% m* ]! r& {% n1 {  " O: b5 f: v* M4 a- y' \1 h
  return 0;
- s6 ^+ {+ }8 `) X' Y9 t}
) W; Z; b4 u8 Y' \7 |9 U8 u
1 n) `2 M, v' T2 s4 z% D$ C- v
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 www.diantuankj.com/ doTeam.tech
回复

使用道具 举报

发表回复

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

返回列表 本版积分规则

  • 发布新帖

  • 在线客服

  • 微信

  • 客户端

  • 返回顶部

  • x
    温馨提示

    本网站(plmhome.com)为PLM之家工业软件学习官网站

    展示的视频材料全部免费,需要高清和特殊技术支持请联系 QQ: 939801026

    PLM之家NX CAM二次开发专题模块培训报名开始啦

    我知道了