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

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

[复制链接]

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

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

admin 楼主

2017-10-17 21:05:45

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

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

x
#include <WinSock2.h>0 z$ {; z: Q6 G+ A( @/ `. F
#include <Iphlpapi.h>& X0 @+ y3 j+ P) L0 y- L$ v* ]; A& B
#include <iostream>. y) S/ i( k5 c8 V
using namespace std;7 y9 A. T5 a, ^; I- m
#pragma comment(lib,"Iphlpapi.lib") //需要添加Iphlpapi.lib库  ~. y) c" z7 T3 S  }5 e

2 p' g0 B% d8 B, Lint main(int argc, char* argv[])9 {' n! O' `, Q* k2 N, n
{# O' `3 `3 H+ K$ Y7 G
  //PIP_ADAPTER_INFO结构体指针存储本机网卡信息
4 c/ [7 I- d8 ^: `% ]+ E  PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO();
3 s! V% N; t* ?8 s2 H* ?- ~! X  //得到结构体大小,用于GetAdaptersInfo参数6 A2 I+ n; C: t( |4 b$ a. o8 W
  unsigned long stSize = sizeof(IP_ADAPTER_INFO);
2 S) T9 \0 p3 Z3 Y- M/ e( c  //调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量;其中stSize参数既是一个输入量也是一个输出量4 L- D) w2 p: g& M- X: }
  int nRel = GetAdaptersInfo(pIpAdapterInfo,&stSize);
  O3 f' Y% }) @0 C  //记录网卡数量" |! m3 D9 M  s8 [
  int neTCardNum = 0;1 |+ |+ U/ }" \$ W  W
  //记录每张网卡上的IP地址数量
" I1 ?, i& z, f  int IPnumPerNetCard = 0;
& W( t0 q. G- t1 s  if (ERROR_BUFFER_OVERFLOW == nRel)  E1 b3 v4 j& P! ~5 l
  {; \4 ]" ^" T; k4 j, r) i
    //如果函数返回的是ERROR_BUFFER_OVERFLOW
# ^/ c4 w% Y" U1 T    //则说明GetAdaptersInfo参数传递的内存空间不够,同时其传出stSize,表示需要的空间大小
/ u3 D3 q' i6 I    //这也是说明为什么stSize既是一个输入量也是一个输出量
2 I% O# e6 ~' z    //释放原来的内存空间0 l5 E; |% \) Z9 k
    delete pIpAdapterInfo;. H5 }! V3 P( h" p. T+ A' ~
    //重新申请内存空间用来存储所有网卡信息7 C* f2 F4 ^4 K$ K; d4 L  y
    pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize];$ T; |' W! l' u% L9 `% q
    //再次调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量
1 T$ F3 A; `5 \    nRel=GetAdaptersInfo(pIpAdapterInfo,&stSize);  / @8 v8 P6 {+ E: o, I3 S
  }
; _1 n, c) q  p- v9 S. v' J  if (ERROR_SUCCESS == nRel)
, z8 @2 d: ^* ?1 o3 H  {( t3 I. k9 W9 C# O  h) |. Q1 p, v1 C
    //输出网卡信息
2 b$ f! W5 Q( S$ e8 n     //可能有多网卡,因此通过循环去判断" D$ E( f5 `7 T, ~) q; Y) m+ H& O
  while (pIpAdapterInfo)9 Y- r, M" L/ W3 P
  {4 M7 D# r0 k" R% g# u8 c2 d
    cout<<"网卡数量:"<<++netCardNum<<endl;
. r! g) p  W! l+ H    cout<<"网卡名称:"<<pIpAdapterInfo->AdapterName<<endl;
% L/ @7 H( c. j+ ~3 q4 t" b7 G    cout<<"网卡描述:"<<pIpAdapterInfo->Description<<endl;7 x' x% g" G4 d6 c# H. t# {
    switch(pIpAdapterInfo->Type)1 R  M+ i' C  K7 b1 _( O
    {
) S3 H8 ^6 o: L    case MIB_IF_TYPE_OTHER:2 k5 |& _3 t3 C4 P9 `/ t
      cout<<"网卡类型:"<<"OTHER"<<endl;4 M& ]1 T4 o: C0 Z
      break;
- x3 B' y: j- H) _) p    case MIB_IF_TYPE_ETHERNET:
) E* s" t( `- m2 ?/ z      cout<<"网卡类型:"<<"ETHERNET"<<endl;
8 q$ c; ?' _! ?7 F      break;
; U( v2 L, j" a, h1 u% G( {- R4 @" t    case MIB_IF_TYPE_TOKENRING:
3 R- E7 r/ K- W! D$ d- ?      cout<<"网卡类型:"<<"TOKENRING"<<endl;2 J8 r  [, ?& O+ m
      break;: [2 d$ J4 \0 B2 J9 P$ P
    case MIB_IF_TYPE_FDDI:
& \2 J7 n& e/ ?1 `; m      cout<<"网卡类型:"<<"FDDI"<<endl;% x5 E0 P8 z1 I* k: F: n( |; Q! Z$ x
      break;
! Y& I( r4 m7 ~# r4 {9 k7 E    case MIB_IF_TYPE_PPP:
2 \: x  J$ ~. C      printf("PP\n");
! V+ O0 G3 v% o5 A9 Q      cout<<"网卡类型:"<<"PPP"<<endl;: y/ J- o1 U( [; `
      break;
; t" S5 w$ j1 h  _/ z0 W( K    case MIB_IF_TYPE_LOOPBACK:
' E4 f3 Y8 c0 o2 b4 n! h0 e      cout<<"网卡类型:"<<"LOOPBACK"<<endl;
/ ]- H$ b) C, o      break;
- K" b' T6 r9 W# Z    case MIB_IF_TYPE_SLIP:0 I6 P' Z% n1 @- |" a
      cout<<"网卡类型:"<<"SLIP"<<endl;  E8 J9 ^  T' e' w4 o+ D0 M5 h. L* M1 h
      break;
# y& Z" T6 @# V( x# Y    default:
3 }; v, w: \/ I& @! S8 }. Q3 X4 `$ @
      break;* l$ V5 e2 S+ ^3 J. Z, l0 }
    }
  k+ I0 {4 i! M: I    cout<<"网卡MAC地址:";5 d) Q6 t( Y% a7 K
    for (DWORD i = 0; i < pIpAdapterInfo->AddressLength; i++)
  y% C7 l  n0 |! r$ R" K      if (i < pIpAdapterInfo->AddressLength-1)
6 M* z) f/ o% v# X$ X7 b; v      {
, D% P9 \$ u" \& k7 N9 z        printf("%02X-", pIpAdapterInfo->Address);
4 n9 Y8 @4 F, |$ c$ U      }
, F- f& D7 {$ h- m$ P; S/ X      else6 ^' r, c* A! z5 e
      {
1 ?* U' }& P" l; J( M        printf("%02X\n", pIpAdapterInfo->Address);
$ H. I$ E5 ^! \7 y1 P* Y      }- v$ @* C: z" n# d, ]" P
      cout<<"网卡IP地址如下:"<<endl;6 p/ W* X3 r% G/ O
      //可能网卡有多IP,因此通过循环去判断( [/ C3 W3 W/ z7 A* O" s5 ]# _
      IP_ADDR_STRING *pIpAddrString =&(pIpAdapterInfo->IpAddressList);' A" e$ t. ?" X! h1 P# A! f. s6 ~
      do
! a  a) c; U3 r, d, X. k      {
4 m5 Y5 L0 l) t; L8 h1 q; m) s        cout<<"该网卡上的IP数量:"<<++IPnumPerNetCard<<endl;
+ Z, M$ L' @( g        cout<<"IP 地址:"<<pIpAddrString->IpAddress.String<<endl;$ z5 X* ^6 V/ Y* `# G+ J7 l) u4 I
        cout<<"子网地址:"<<pIpAddrString->IpMask.String<<endl;
3 B/ q  T, O9 [        cout<<"网关地址:"<<pIpAdapterInfo->GatewayList.IpAddress.String<<endl;
' u" w& I. ]' K& D7 i; f7 R        pIpAddrString=pIpAddrString->Next;
  v9 y  Q8 |' c& @      } while (pIpAddrString);( f7 k2 p9 B9 g) Q) ^0 n
      pIpAdapterInfo = pIpAdapterInfo->Next;$ p. L$ c4 c# o2 d! _
      cout<<"--------------------------------------------------------------------"<<endl;
$ x) Q2 \/ S+ L% `1 o  }6 L- }* _7 ]; b9 y5 d( h
   
  H) m, C) q  @2 u  a; L: y  V  }
7 Y7 g, o: K8 j  //释放内存空间
- i6 V3 O# c) i/ Z3 U- K% [  if (pIpAdapterInfo)9 k% {9 W/ ]: P4 P% i8 n
  {* g& }* \0 \0 R) y4 C1 P
    delete pIpAdapterInfo;  f' U6 v0 c7 I
  }' k" ^  |  \" l+ q/ Q
  2 M; I+ h* T% @
  return 0;) w6 {  o' }' M, J; g
}
. U' M  W5 N  L& W
0 a$ W  k7 R% o; q2 F
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了