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

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

[复制链接]

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

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

admin 楼主

2017-10-17 21:05:45

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

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

x
#include <WinSock2.h>
- G& F% a4 Y+ A#include <Iphlpapi.h>
! X: {, W) g$ g1 q$ ]#include <iostream>; L: z8 v& X3 T4 r8 x
using namespace std;
* j, A8 \% j6 ~' i( m#pragma comment(lib,"Iphlpapi.lib") //需要添加Iphlpapi.lib库
  ^& c( C: W- l  A% t$ O) \! D3 v# x! c3 n1 E8 m- `
int main(int argc, char* argv[])5 v2 r9 x0 n& `1 X5 K& {% u- A6 Y! h
{4 y3 v4 n0 W1 f; d; B# L2 p
  //PIP_ADAPTER_INFO结构体指针存储本机网卡信息
: F! `- u5 {$ H; d& R9 s  PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO();
1 _6 I, a" B0 D9 G  //得到结构体大小,用于GetAdaptersInfo参数
& V0 T) }9 O" L- d: s( b# W  unsigned long stSize = sizeof(IP_ADAPTER_INFO);
, E; \8 o# r( H  //调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量;其中stSize参数既是一个输入量也是一个输出量7 t# G0 K/ }5 f% Y6 m' u' K
  int nRel = GetAdaptersInfo(pIpAdapterInfo,&stSize);$ R8 x# _; _; ?' C3 X+ z
  //记录网卡数量2 n! Z; n  n1 Y. M; U: ?1 M
  int neTCardNum = 0;
2 _6 ]! O- R9 F& ?$ p' {( \  //记录每张网卡上的IP地址数量
% E% ?' p' L! k; [: `% S2 R  int IPnumPerNetCard = 0;
) B# R* r. v: p7 x. I. z' o  if (ERROR_BUFFER_OVERFLOW == nRel)$ X  ]5 i' J8 ]. |- N1 {% ]/ ~
  {7 T: V9 V. p7 O6 W+ c( ?8 ^
    //如果函数返回的是ERROR_BUFFER_OVERFLOW
2 E6 ~5 U7 i1 s5 U0 R$ e5 s    //则说明GetAdaptersInfo参数传递的内存空间不够,同时其传出stSize,表示需要的空间大小7 H# e1 m7 N. ^4 N9 a, |/ _& X/ z
    //这也是说明为什么stSize既是一个输入量也是一个输出量& b1 w; i7 m8 ^
    //释放原来的内存空间
$ T7 K% k- z) W. P    delete pIpAdapterInfo;& k. p4 x7 ?' X% j3 @1 J4 D
    //重新申请内存空间用来存储所有网卡信息: ?  d# z4 i3 i" E. O" Z
    pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize];4 F- m, }' A) }1 [6 T9 {8 O4 G8 l5 n
    //再次调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量
' J! [& \- R5 t6 C* E    nRel=GetAdaptersInfo(pIpAdapterInfo,&stSize);  3 o  [5 H4 j/ l" F) ]
  }9 u2 z) Y& V, }" g  N
  if (ERROR_SUCCESS == nRel)+ A2 n" U4 k; }! v, I% V8 {
  {
8 l2 c" o. v2 g3 t" B% V    //输出网卡信息
( W8 Q& E5 Q; A, ?# j! k     //可能有多网卡,因此通过循环去判断
9 K# p( E7 Y9 ?% g4 n. a- s  while (pIpAdapterInfo)
5 p$ b: s- ?1 D! k  |  {
) o$ n: O# q7 S& q0 {% I/ L, ^' l% D/ w% ?    cout<<"网卡数量:"<<++netCardNum<<endl;
5 }8 h: b3 `9 J# E* F# z! @0 S    cout<<"网卡名称:"<<pIpAdapterInfo->AdapterName<<endl;
( ]1 A7 F! \8 X  R& a    cout<<"网卡描述:"<<pIpAdapterInfo->Description<<endl;
& E/ K/ _  ?; t1 v/ E    switch(pIpAdapterInfo->Type). `6 ~% [  c: G' _
    {7 {% j3 \/ v/ t  g6 Q1 m3 q
    case MIB_IF_TYPE_OTHER:
9 W8 u5 Z7 a+ z- s      cout<<"网卡类型:"<<"OTHER"<<endl;
  e* x5 U7 v/ L! t5 ?/ e4 \      break;
$ z3 S9 c( x: b; `6 ^$ o    case MIB_IF_TYPE_ETHERNET:
. H0 ^  l7 E4 g, E      cout<<"网卡类型:"<<"ETHERNET"<<endl;9 F8 s: A' V1 Q  [  L: I; q
      break;. @! I/ ~$ i6 Q9 T
    case MIB_IF_TYPE_TOKENRING:0 E. N8 o3 f% Z5 ~8 c
      cout<<"网卡类型:"<<"TOKENRING"<<endl;
% l9 j9 t/ U' M0 s4 m/ d      break;6 u" E# z! g! j* d8 w
    case MIB_IF_TYPE_FDDI:5 g. ~  E8 ?! q9 C( c6 I
      cout<<"网卡类型:"<<"FDDI"<<endl;9 t7 w, F& k' n: d% `. c. L! K
      break;
( h/ H/ G. \) x$ C6 @9 B    case MIB_IF_TYPE_PPP:
: b6 a* `* Y9 p* e: w      printf("PP\n");( h( z- I, y, D( f; M( {
      cout<<"网卡类型:"<<"PPP"<<endl;
2 [! I- s9 s- Q0 W: x      break;
! `4 ]$ Q7 T9 V2 V; b    case MIB_IF_TYPE_LOOPBACK:6 M3 m3 ^, C$ W9 ?  Z7 Q
      cout<<"网卡类型:"<<"LOOPBACK"<<endl;: S9 b0 r3 C3 y7 L+ z0 q
      break;# y4 O  a8 T( i& w
    case MIB_IF_TYPE_SLIP:
1 }3 e7 |- r9 a& J( r2 m7 ?1 F9 i8 S      cout<<"网卡类型:"<<"SLIP"<<endl;7 q2 T0 h2 L4 U& f
      break;* K5 z  O; n+ a% n. c
    default:+ A" G% k* H' p* U% b
3 a: D+ e5 w4 p5 m
      break;
7 n3 v( |5 K: h# F: i    }3 E7 H; k; K: q& L
    cout<<"网卡MAC地址:";
; h, |. N0 w2 n: |! P    for (DWORD i = 0; i < pIpAdapterInfo->AddressLength; i++)
, k* F+ b6 }: {# K( M      if (i < pIpAdapterInfo->AddressLength-1)+ G0 c- r. ~/ Y# X: A; k
      {
$ H( ^0 I& p% O9 p9 r3 |/ z        printf("%02X-", pIpAdapterInfo->Address);0 |, W$ g* \. k9 E3 @( O& j
      }
8 v2 q" u' e' a) D0 }4 L- W      else
- `7 n5 k6 O+ A# i  n      {" O; J3 s1 {/ e8 b
        printf("%02X\n", pIpAdapterInfo->Address);
) U& Q* p7 z2 R# U      }/ E4 g- Z" D& o# M/ ~8 k
      cout<<"网卡IP地址如下:"<<endl;. s6 R, r2 {! I+ W  J, }
      //可能网卡有多IP,因此通过循环去判断2 f9 K2 @' b4 ?
      IP_ADDR_STRING *pIpAddrString =&(pIpAdapterInfo->IpAddressList);2 e2 \  O, l& F, K4 Z, z2 A
      do3 |# {. E4 @8 ]
      {1 i# B" A* P8 F" @0 k
        cout<<"该网卡上的IP数量:"<<++IPnumPerNetCard<<endl;3 _5 Q) w& ^- @5 q8 E1 A
        cout<<"IP 地址:"<<pIpAddrString->IpAddress.String<<endl;
4 U2 X% d2 \7 J* H        cout<<"子网地址:"<<pIpAddrString->IpMask.String<<endl;+ s2 H, q5 ?! J% W9 b
        cout<<"网关地址:"<<pIpAdapterInfo->GatewayList.IpAddress.String<<endl;0 `, o" Q8 x' V* k, d! _. \
        pIpAddrString=pIpAddrString->Next;
4 V, g( X( a6 ]# ~" J6 G: P7 w. ]& R      } while (pIpAddrString);
$ S  T* {  E2 F( T2 {: G8 R! c      pIpAdapterInfo = pIpAdapterInfo->Next;$ t6 N& P5 X2 l) I4 L0 A
      cout<<"--------------------------------------------------------------------"<<endl;* V- t2 H; z& b) M& k' V1 g
  }$ P* j- K4 t0 l: j
   
3 v6 |& y/ e, @( o& ?  }
) T& p6 I" |, \! Y  //释放内存空间$ [4 V: [3 h, c# p
  if (pIpAdapterInfo)) [7 }+ [4 f3 b* Z3 i  [3 P0 A) t
  {" t6 U" _4 w, w3 @9 ~" s' F
    delete pIpAdapterInfo;
' H7 u1 Q, |7 v& I( }- j7 F" v  }" ]) n% _1 m2 }8 [0 [
  
1 {+ [! ?) a) y8 V1 h  return 0;7 i3 R0 C: S, A
}
6 W" X; K! x+ S, _. f9 p0 E" _3 j3 E, K4 r
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了