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

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

[复制链接]

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

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

admin 楼主

2017-10-17 21:05:45

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

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

x
#include <WinSock2.h>
+ q* E5 s! L- w/ O( `$ B' O, D#include <Iphlpapi.h>
& s) f1 f$ |# K#include <iostream># W% l0 u) M. v  c( _1 n0 {
using namespace std;- q, j# a: [" t
#pragma comment(lib,"Iphlpapi.lib") //需要添加Iphlpapi.lib库
& g' G7 J/ G5 m2 }) C# z- c& l
0 o9 E. S3 Y# n- Iint main(int argc, char* argv[])
2 B7 b  [: X- v' P0 o: u{6 I2 W3 ~8 z! v- x# Q4 P- X$ u
  //PIP_ADAPTER_INFO结构体指针存储本机网卡信息7 l6 L4 b& K' j/ z/ P
  PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO();) w' ^+ b) T/ ]$ J* B2 [
  //得到结构体大小,用于GetAdaptersInfo参数
% w& l8 B5 B) a0 u  unsigned long stSize = sizeof(IP_ADAPTER_INFO);
1 E4 U, H3 l# `) \4 n: w; }  //调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量;其中stSize参数既是一个输入量也是一个输出量8 l/ ]+ J$ H8 L; {: Q" O+ ~4 k1 ?/ b
  int nRel = GetAdaptersInfo(pIpAdapterInfo,&stSize);; L- p+ j6 h& M
  //记录网卡数量, _1 v% i3 z: V; ?: x9 p3 b
  int neTCardNum = 0;3 V- ~; _* H, D" w
  //记录每张网卡上的IP地址数量- _3 Q# o& o# n7 n
  int IPnumPerNetCard = 0;- a( \( c* ^8 h; R
  if (ERROR_BUFFER_OVERFLOW == nRel)( g! ^6 X* Z! A  V4 ^5 i& `1 I$ x
  {, q3 @, U2 g$ u3 s% w$ ]9 Z6 a
    //如果函数返回的是ERROR_BUFFER_OVERFLOW* Y( h1 S+ y+ Z, M. {" C" n: ^
    //则说明GetAdaptersInfo参数传递的内存空间不够,同时其传出stSize,表示需要的空间大小" ]$ J/ f9 E& F6 X* F: U
    //这也是说明为什么stSize既是一个输入量也是一个输出量
+ L7 u: y) `6 X/ h. d    //释放原来的内存空间+ e/ X. m2 \5 y/ ~) g& {/ b
    delete pIpAdapterInfo;
& [5 t0 W  I4 x    //重新申请内存空间用来存储所有网卡信息
+ I  B& Q, B* K0 V    pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize];
' N( n. n) I9 @  ?2 ~    //再次调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量3 c2 p* B, A1 }: e0 W: h
    nRel=GetAdaptersInfo(pIpAdapterInfo,&stSize);  
: ~* Z2 V$ s9 D  }- N& g# }7 {) v1 j* ~% u" k
  if (ERROR_SUCCESS == nRel)
. b9 a) ]* O2 ^4 ?2 ]( o- f- E  {
/ j; i0 `. `- {! i, }' i7 D    //输出网卡信息
5 x! z1 t% w) c3 w2 a( B     //可能有多网卡,因此通过循环去判断
. J$ I% a) m3 O$ n4 q& g  while (pIpAdapterInfo)" {5 ?$ f: Y% G7 R+ M1 \
  {2 |1 n, E/ K! I" [" y
    cout<<"网卡数量:"<<++netCardNum<<endl;
% J. T4 j( M& j; I% r9 W    cout<<"网卡名称:"<<pIpAdapterInfo->AdapterName<<endl;
, w; N1 t! [2 a9 d    cout<<"网卡描述:"<<pIpAdapterInfo->Description<<endl;& i5 P4 G. O. e5 Z# G
    switch(pIpAdapterInfo->Type)
/ n! d. a$ y3 g' F  [$ s7 d. T    {
$ @+ s/ |6 `/ f6 ]' w    case MIB_IF_TYPE_OTHER:7 s( Q0 ?8 P3 _3 x( X& ]
      cout<<"网卡类型:"<<"OTHER"<<endl;
0 ~5 E. A7 }% q) N8 f- U, B      break;
1 E, h- e- w- ]( d. R0 d; Q7 K    case MIB_IF_TYPE_ETHERNET:
3 Y# k2 Q! v( X4 _" @      cout<<"网卡类型:"<<"ETHERNET"<<endl;
# E1 i. D) U. @4 T1 U      break;2 w2 F/ D# v; I8 T1 s
    case MIB_IF_TYPE_TOKENRING:
4 E% z$ H8 R  A2 x      cout<<"网卡类型:"<<"TOKENRING"<<endl;
! a( S0 [$ H, L) `. t) q7 m      break;5 X+ q# X8 V4 U& \; V
    case MIB_IF_TYPE_FDDI:" X  v/ J- z  }( R2 p: _& G
      cout<<"网卡类型:"<<"FDDI"<<endl;
  O6 k/ ]; O: p% C" x      break;' R. S; A6 N8 P; }- u
    case MIB_IF_TYPE_PPP:' H1 k% c, Z6 E8 `
      printf("PP\n");
8 h, _# H. W; X  H! f; }6 _0 w      cout<<"网卡类型:"<<"PPP"<<endl;
5 X& v/ U0 j; U+ K      break;
. l) D/ s4 k0 i; L$ y" I    case MIB_IF_TYPE_LOOPBACK:
4 ~1 w: x3 D+ k6 |9 y  Y( @      cout<<"网卡类型:"<<"LOOPBACK"<<endl;
( n. Z: V! \  V( g" p. Q4 `( z      break;) _( G+ z- q6 V$ q
    case MIB_IF_TYPE_SLIP:
) u( ~% H. E; Y+ h8 d$ r+ Q      cout<<"网卡类型:"<<"SLIP"<<endl;
/ x! S' P" }# _: `5 a0 ^% a      break;9 y* `% w3 O. q6 @* p/ H
    default:
" o! p! u- D. u+ h# l8 `4 B5 s2 ?- T6 T# ?6 o4 Y& f& C: L% G
      break;1 H: W( b3 p9 B
    }: y% N, E" n+ q  x" i. \0 ]4 H4 B8 O
    cout<<"网卡MAC地址:";
! c/ E1 u1 N! C. ?    for (DWORD i = 0; i < pIpAdapterInfo->AddressLength; i++)
1 Y) {) P. u0 B+ v: L6 W      if (i < pIpAdapterInfo->AddressLength-1)
/ O* S( i) q4 l, }/ Q; e! \      {
+ c6 k% H3 U4 a( l' s        printf("%02X-", pIpAdapterInfo->Address);( r1 p4 ^6 l# R5 y& ?
      }+ p. d0 |7 F6 g
      else( l4 f" T: o; m7 F1 e
      {
9 W( x+ ]: t3 i* c. w5 y        printf("%02X\n", pIpAdapterInfo->Address);
+ J# x$ r: W2 i0 N+ x: t6 s      }7 e, W4 y* Q4 h1 N
      cout<<"网卡IP地址如下:"<<endl;9 S4 y% F4 A# L  R: J) a
      //可能网卡有多IP,因此通过循环去判断6 @& H0 K! m- [2 f: R0 U" a
      IP_ADDR_STRING *pIpAddrString =&(pIpAdapterInfo->IpAddressList);
! q; ]- U1 P2 @, E& j2 a! u      do' `! A& \' N4 L7 L' `% O3 x
      {
; l7 s9 c0 m7 j; @; Q  s        cout<<"该网卡上的IP数量:"<<++IPnumPerNetCard<<endl;1 _2 _+ Z2 P8 v; p
        cout<<"IP 地址:"<<pIpAddrString->IpAddress.String<<endl;7 Z  l# Z6 ?5 q% J" |
        cout<<"子网地址:"<<pIpAddrString->IpMask.String<<endl;! T: S/ [- |9 ^0 D. ]$ K
        cout<<"网关地址:"<<pIpAdapterInfo->GatewayList.IpAddress.String<<endl;: O' D3 |' d5 ?3 K) ~8 ^0 ~- Z! q
        pIpAddrString=pIpAddrString->Next;5 a# h4 j8 X0 r' f8 I8 Y5 O
      } while (pIpAddrString);7 K2 D" a7 }  n. j- K( I9 T! V- {
      pIpAdapterInfo = pIpAdapterInfo->Next;+ l( ]  [# a" [
      cout<<"--------------------------------------------------------------------"<<endl;
4 g& c0 ?7 p6 l! C! a  }5 ~6 ^/ K( Z6 p) A
   
# S6 q% r2 p4 ~, F% f  }0 R/ N. f3 l$ z' W5 B& X( }% E
  //释放内存空间
! N! q# y! j) o& m2 P9 x  if (pIpAdapterInfo)) |8 c7 r7 Y4 o0 u
  {
1 j* C" \/ o3 a4 b" b0 k. E    delete pIpAdapterInfo;9 D9 |# k8 s* m- E7 ^: f6 F! |
  }
# B8 V3 r' _& R( n, b  
3 B9 R" v) {6 q, H2 _0 P  return 0;
" ~1 ^, [2 \6 T+ G" k2 R! [}
; ]5 k0 ?  j: a! }7 J6 m
) E! s0 w7 g: Q+ }
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了