PLM之家PLMHome-工业软件践行者

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

[复制链接]

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

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

admin 楼主

2017-10-17 21:05:45

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

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

x
#include <WinSock2.h>/ p. m5 u: J6 u" ~
#include <Iphlpapi.h>. C+ A( F7 {0 ~5 `
#include <iostream>
. ?" _$ D0 {, j2 C0 Susing namespace std;
) p# W/ \; \- L. z#pragma comment(lib,"Iphlpapi.lib") //需要添加Iphlpapi.lib库
; l0 Z) _9 f. h$ \- b. X) [7 h3 T$ L" M
int main(int argc, char* argv[])
# t% q% y$ F" B! }. _% E{" T0 G. i. }: L7 }. L/ h5 P% {
  //PIP_ADAPTER_INFO结构体指针存储本机网卡信息6 y7 M+ O0 |& ?# U' Q
  PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO();3 S. w) G, a' A" F+ m' {) t
  //得到结构体大小,用于GetAdaptersInfo参数
/ R& l3 N$ E2 I7 U  unsigned long stSize = sizeof(IP_ADAPTER_INFO);2 Z, N( z" R0 O
  //调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量;其中stSize参数既是一个输入量也是一个输出量
5 D6 L  H# G. E/ H( j( m  int nRel = GetAdaptersInfo(pIpAdapterInfo,&stSize);
) H7 a" [. ~' L  //记录网卡数量+ E+ T7 V% e$ I1 V
  int neTCardNum = 0;+ E6 I3 M2 T4 @
  //记录每张网卡上的IP地址数量5 P8 Q# ?' {4 m( h, Z" {3 o+ O
  int IPnumPerNetCard = 0;9 D; m. s/ n" z4 g# H- ?/ G
  if (ERROR_BUFFER_OVERFLOW == nRel)) w2 F5 [8 E) n5 D& m& q
  {2 s* z" D5 S7 R8 m$ ~
    //如果函数返回的是ERROR_BUFFER_OVERFLOW7 ?  z& a  N& `2 C; b
    //则说明GetAdaptersInfo参数传递的内存空间不够,同时其传出stSize,表示需要的空间大小
  O* k! ?7 z8 S+ w0 e, }    //这也是说明为什么stSize既是一个输入量也是一个输出量
. \5 L8 v. J5 k    //释放原来的内存空间
' {9 c# h+ U, g3 l    delete pIpAdapterInfo;  ^3 ?& F! D2 M3 P
    //重新申请内存空间用来存储所有网卡信息) W9 D$ k) e4 X" ~1 u% l
    pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize];& m4 O' i& ]' q
    //再次调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量
  r& l* X9 f' N) X/ \6 z    nRel=GetAdaptersInfo(pIpAdapterInfo,&stSize);  
) \( \7 ?7 j( f! E  }
9 x/ B) T2 t$ k% b! G9 f  if (ERROR_SUCCESS == nRel)
( o% a) p% s- b1 g  V  {( w: ]/ R- k% U3 p6 w: _/ w6 e1 _
    //输出网卡信息' {0 \. O, ]( L# I; n2 U
     //可能有多网卡,因此通过循环去判断
2 {4 p& H5 z5 @! z1 x. R  while (pIpAdapterInfo)
! L1 [5 i$ h7 U/ f- h+ L' Z5 m0 l  {7 l" U6 \7 T8 F/ K9 R' e- B
    cout<<"网卡数量:"<<++netCardNum<<endl;: @7 p  g' y7 ^# h: [" C, Z
    cout<<"网卡名称:"<<pIpAdapterInfo->AdapterName<<endl;0 i) R+ s2 M6 T
    cout<<"网卡描述:"<<pIpAdapterInfo->Description<<endl;
6 K& C; s5 U. Y. ~    switch(pIpAdapterInfo->Type)
% J- d# g, O6 K& Q$ ?4 f. t, O, C    {/ o& v& v" d! ?' n. B2 `
    case MIB_IF_TYPE_OTHER:
: R) x7 y; U- b& ~7 L: {      cout<<"网卡类型:"<<"OTHER"<<endl;  T% n2 e9 n3 a
      break;
3 u4 H/ h& `! Y4 E! c, S) A    case MIB_IF_TYPE_ETHERNET:
- z( W  R7 l# w# M8 T  H& X      cout<<"网卡类型:"<<"ETHERNET"<<endl;" D. v5 c. @$ B$ }9 j9 x, z: U1 f; c
      break;
6 S  P; a* q; f$ Y    case MIB_IF_TYPE_TOKENRING:0 p0 q& s! l5 U5 h
      cout<<"网卡类型:"<<"TOKENRING"<<endl;$ g7 b5 T! v, H3 E0 l
      break;$ ?$ _0 {4 }. r$ f: X
    case MIB_IF_TYPE_FDDI:
' O' D4 D+ l4 |1 H      cout<<"网卡类型:"<<"FDDI"<<endl;
" b% ?* M, q8 D9 `$ }# x      break;
$ y- O2 j; f! ~( T# @# H. p2 K    case MIB_IF_TYPE_PPP:4 _# n% ~" I" P& y: T1 H5 W
      printf("PP\n");
" P* }/ Y: n+ w$ x: \3 t- x" z      cout<<"网卡类型:"<<"PPP"<<endl;
$ V2 B, t8 O5 t# G; J+ z" A- H      break;
0 W$ x0 m  W' ~) p; W    case MIB_IF_TYPE_LOOPBACK:
, n2 j; v5 N+ `2 N- c9 t      cout<<"网卡类型:"<<"LOOPBACK"<<endl;
( p: {7 e$ f2 B; ?      break;
9 a& D: o2 \$ j" V6 U' u& K    case MIB_IF_TYPE_SLIP:6 j! P3 `/ F8 Y
      cout<<"网卡类型:"<<"SLIP"<<endl;: B2 P$ @2 @4 n3 Z+ i. ]: H
      break;. f% C, i$ E1 k# C, R( ?" ~5 R$ T# o
    default:" W; c1 H1 X, M  @
) a# @4 ^( |* {( a& L
      break;
! {; \% T- Z- T  u& V0 Z    }' m( N$ N& P0 e3 }3 |, f- _+ |
    cout<<"网卡MAC地址:";
) _' K" w$ ~2 O# l3 T" k* s    for (DWORD i = 0; i < pIpAdapterInfo->AddressLength; i++)
, p3 \& h" m7 m+ ~+ L9 Y      if (i < pIpAdapterInfo->AddressLength-1)& h  h5 [: E: }. f) N: s, T0 `
      {2 b" ~: F8 _. x1 v; d) ^" h% P
        printf("%02X-", pIpAdapterInfo->Address);
0 o% ~( K7 B& g" e$ j. M: }- c' t) N      }
+ f9 z, ^/ l7 ^7 W0 U& p      else6 ~' C9 Q, t# l# ?; s9 H4 u* Z  \
      {
0 h% k: `9 K2 z4 B/ l        printf("%02X\n", pIpAdapterInfo->Address);9 \: ]1 a7 W- h
      }9 w) S: @% Q. L& w
      cout<<"网卡IP地址如下:"<<endl;- V5 K- C* U& d+ C) k; u" u
      //可能网卡有多IP,因此通过循环去判断
7 h$ A& H! h2 Y6 ]. d6 h& K      IP_ADDR_STRING *pIpAddrString =&(pIpAdapterInfo->IpAddressList);
. h) ?8 Z- a3 y: c$ m+ p      do& r6 ~2 s" @4 M# z
      {7 ^: F1 S6 d  U2 u/ v4 m+ p- a' a
        cout<<"该网卡上的IP数量:"<<++IPnumPerNetCard<<endl;  }" Q# V- L! O7 K% i* U
        cout<<"IP 地址:"<<pIpAddrString->IpAddress.String<<endl;0 N9 `6 P, T; m( D5 n& |
        cout<<"子网地址:"<<pIpAddrString->IpMask.String<<endl;
& r- Z5 V/ _2 S- J! z9 d        cout<<"网关地址:"<<pIpAdapterInfo->GatewayList.IpAddress.String<<endl;
; i7 _- A3 k& ?" \5 E4 h        pIpAddrString=pIpAddrString->Next;4 }5 v/ k. G3 U. O/ R: `+ i
      } while (pIpAddrString);
" T8 ~/ x6 C) p1 D) t# e      pIpAdapterInfo = pIpAdapterInfo->Next;/ s% A3 w* H) x: d# _: Q# m
      cout<<"--------------------------------------------------------------------"<<endl;) |. |  N0 ]. S
  }8 t6 Y, i0 O4 u
   $ L' c6 D6 ^% M
  }
0 k% J5 u* k0 C7 O  f  //释放内存空间. {. e6 N5 T  k/ }4 o- {
  if (pIpAdapterInfo)
. h" I% N( L5 A( M( u% @* C  {$ [/ K% T- j( j; d
    delete pIpAdapterInfo;
" z9 K. X; i" M9 u! D  }, e4 A/ r; W; T1 x3 A2 K0 T/ l
  
- x* R9 y# ~; V  return 0;
' t% k3 N% l$ x; i% `}
9 [0 _. q' Q1 C' A4 w  O" |! I+ n! K  r4 V6 F: f# ?" e+ I, J# J. o
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了