PLM之家PLMHome-工业软件与AI结合践行者

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

[复制链接]

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

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

admin 楼主

2017-10-17 21:05:45

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

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

x
#include <WinSock2.h>
6 @1 l  E3 C. ]: m, a' l#include <Iphlpapi.h>
9 T9 b: b. D& t2 n, E) ?#include <iostream>$ t# ^, b/ ^* z! Z+ j
using namespace std;, X  m: F4 `* e) r+ B  e4 I, }
#pragma comment(lib,"Iphlpapi.lib") //需要添加Iphlpapi.lib库
2 ?3 ]' N- m: X0 P" f1 n; ?; v
$ M0 G0 i# \+ l9 ^$ d! Uint main(int argc, char* argv[])# b+ A8 ~" g2 G/ |
{7 @; G! k5 c* r
  //PIP_ADAPTER_INFO结构体指针存储本机网卡信息
8 ]' v7 t' p2 L6 U  PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO();6 E& F$ v1 B5 k+ W' X# }9 y
  //得到结构体大小,用于GetAdaptersInfo参数" {9 p7 u+ Y( q. p, S
  unsigned long stSize = sizeof(IP_ADAPTER_INFO);
6 H6 C5 Z& c8 k, v  r3 Q  //调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量;其中stSize参数既是一个输入量也是一个输出量! }1 ^4 F5 Y8 _- M
  int nRel = GetAdaptersInfo(pIpAdapterInfo,&stSize);- A! k! J* s" ^& h. g& o6 q
  //记录网卡数量
' F6 Z* a/ {# u/ o3 S5 G  int neTCardNum = 0;' }& O; q& ^. b) _9 {7 N
  //记录每张网卡上的IP地址数量
1 F* m$ }$ Z9 u3 M+ t  int IPnumPerNetCard = 0;
1 T: O1 i* v2 ^& I  if (ERROR_BUFFER_OVERFLOW == nRel)
$ W6 _+ F1 q- n- \0 A2 s' H  {  J1 S2 r, w  {$ b* H  \
    //如果函数返回的是ERROR_BUFFER_OVERFLOW" c8 D- p. ^8 b: z8 X  u
    //则说明GetAdaptersInfo参数传递的内存空间不够,同时其传出stSize,表示需要的空间大小8 w; _: o" M% l  Y- `, P
    //这也是说明为什么stSize既是一个输入量也是一个输出量
& C. X& [. U! ^- @! i2 e, l    //释放原来的内存空间$ J& N3 b( U: u  S
    delete pIpAdapterInfo;! X" G/ Q" C1 t' D7 L& ?
    //重新申请内存空间用来存储所有网卡信息$ y3 N! G: h" U, {- P& ?8 f9 C
    pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize];
7 ]7 u; N; T' X$ x' A' U    //再次调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量1 q  L1 X% J) K
    nRel=GetAdaptersInfo(pIpAdapterInfo,&stSize);  
# U4 X1 c' ?1 Z4 f  }6 o! T3 D+ `9 K0 O/ L+ n3 u
  if (ERROR_SUCCESS == nRel)8 O- S; h2 X" ]* g6 k& @0 i. m8 N
  {
6 i( w  Z; p7 ]    //输出网卡信息
5 M; Z: u6 O( [9 `% E     //可能有多网卡,因此通过循环去判断% _; f8 N' I, V+ v( v
  while (pIpAdapterInfo)
. f& T/ C. J! Q; }3 g# j1 J8 o  {
5 O  c2 I: \  }  @    cout<<"网卡数量:"<<++netCardNum<<endl;
  T* ]) R( D$ @4 b4 Y, T' v    cout<<"网卡名称:"<<pIpAdapterInfo->AdapterName<<endl;
; S" v9 E% x# b* ?8 K+ L3 M% K- g    cout<<"网卡描述:"<<pIpAdapterInfo->Description<<endl;
" U  R" b- c: O; T  W    switch(pIpAdapterInfo->Type)
9 m5 o& s  v, j    {
- a0 }2 f  m: M+ Y1 S    case MIB_IF_TYPE_OTHER:
9 s  R; t" d7 H, c. ]      cout<<"网卡类型:"<<"OTHER"<<endl;
( c1 j8 D& r* ~( E- i1 F      break;
6 z; q7 o4 C6 W/ s" O# A" q. G    case MIB_IF_TYPE_ETHERNET:7 `( S  [  J0 |( S# @9 f
      cout<<"网卡类型:"<<"ETHERNET"<<endl;! I9 Y- @5 D  E5 W9 p# {
      break;: W% G. |; F# t; s9 u
    case MIB_IF_TYPE_TOKENRING:4 I- p! _; D0 w. W  n. A0 U
      cout<<"网卡类型:"<<"TOKENRING"<<endl;6 A4 D- [0 {4 _/ \# }8 ~
      break;8 F. z2 q) O2 T% S; r& Y7 q( n. D
    case MIB_IF_TYPE_FDDI:
9 D; L, _- n" o0 Q( I( S6 R      cout<<"网卡类型:"<<"FDDI"<<endl;) f2 x9 D2 s6 S7 m2 v( w3 ?
      break;) d/ e3 `1 b- o& C  z
    case MIB_IF_TYPE_PPP:0 M7 z* {* n3 A6 j
      printf("PP\n");2 E6 g, r- M0 ]) q
      cout<<"网卡类型:"<<"PPP"<<endl;0 H. O* f: @$ K8 C8 K. ~
      break;
7 R4 Q4 W. S  [& V0 f0 d) c. k    case MIB_IF_TYPE_LOOPBACK:
. q/ W. ]' `# |8 g" _/ e      cout<<"网卡类型:"<<"LOOPBACK"<<endl;
: y+ n) K4 m- U4 u  K* [3 ^9 |      break;4 T5 _  T9 Z8 s3 J. W/ I2 v7 j
    case MIB_IF_TYPE_SLIP:2 {) l6 w3 [  r. _% f
      cout<<"网卡类型:"<<"SLIP"<<endl;( ?/ g0 E# U- l- D5 [
      break;0 Y0 M" Q  P2 H! h! ]+ ~
    default:
7 T& W3 S% ~7 r7 m" s, B' j. R9 g! V  k( v
      break;1 n) K. ~" Z2 \, V
    }
9 c1 T& Q4 o( u. z( G; C, E8 r    cout<<"网卡MAC地址:";
% @1 q( [# z4 C' \! b( L    for (DWORD i = 0; i < pIpAdapterInfo->AddressLength; i++)
: g9 k: l  P4 i3 H" r0 P      if (i < pIpAdapterInfo->AddressLength-1)
- A, T1 N$ {4 {. c5 ^      {& ?" |1 U6 Y7 @& i
        printf("%02X-", pIpAdapterInfo->Address);; L' Y; I8 s+ Y5 _2 E6 K/ v
      }
) @7 N: i) D/ y& K8 F4 w0 U      else8 X' V1 r3 f4 b/ w
      {
' R# L1 Z" p9 c0 m        printf("%02X\n", pIpAdapterInfo->Address);
" d$ m' S! h& a0 d# g. H# `      }: c4 o* B: B; |
      cout<<"网卡IP地址如下:"<<endl;2 I: C, U; L7 \# ?4 \% }/ C, m
      //可能网卡有多IP,因此通过循环去判断0 ~1 d1 U. F2 M8 ], b
      IP_ADDR_STRING *pIpAddrString =&(pIpAdapterInfo->IpAddressList);
( Q5 O* @: y6 K. l5 I& w      do; x1 c- q1 A! b3 q
      {
# B  M( H2 \& p% L* `7 s1 J  t2 o        cout<<"该网卡上的IP数量:"<<++IPnumPerNetCard<<endl;
, r/ h: B8 _: r        cout<<"IP 地址:"<<pIpAddrString->IpAddress.String<<endl;
2 L3 N/ J5 Q' S" n        cout<<"子网地址:"<<pIpAddrString->IpMask.String<<endl;, D  [/ T% f  _3 \8 e5 F7 a4 q
        cout<<"网关地址:"<<pIpAdapterInfo->GatewayList.IpAddress.String<<endl;, U" D0 Y0 X; @
        pIpAddrString=pIpAddrString->Next;
9 u  h/ x" }" }( @      } while (pIpAddrString);
% |& |9 l/ i' L! w0 D      pIpAdapterInfo = pIpAdapterInfo->Next;
8 _" h! V( i: J2 E/ R8 A      cout<<"--------------------------------------------------------------------"<<endl;9 L! G- M. n  [% |' ~
  }8 m7 p9 o/ |: r+ N% K; w/ x
   : \4 X" S: _% a! J$ W7 C
  }
' }- K: K- e& d. L  O6 Z7 K  //释放内存空间
. B, K/ `; @9 f' a; t  if (pIpAdapterInfo)) g. M; S/ `5 E2 |7 c- x! n
  {! K: X+ P/ A8 a
    delete pIpAdapterInfo;
5 F- Q! k6 k' G; Q  }% S1 t" q2 D% E
  
' ~+ _$ M. X" B  return 0;
* F' ^( {, ^+ I9 P}
) z+ H" {" i. r2 w: z
0 d' i( v" [+ `7 u
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了