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

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

[复制链接]

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

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

admin 楼主

2017-10-17 21:05:45

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

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

x
#include <WinSock2.h>% g9 x% ~* T+ h3 V4 U
#include <Iphlpapi.h>
1 D5 j5 d# z. Z7 v$ V#include <iostream>* T) c" k( T( v
using namespace std;
( ^" z0 V% H1 a9 A- H1 y! i#pragma comment(lib,"Iphlpapi.lib") //需要添加Iphlpapi.lib库
. t2 U1 ?/ v% N/ o2 P. W
! b7 L' ^9 K& k% L$ Q. k3 O/ sint main(int argc, char* argv[])/ u; t; Z3 D- G6 r) s
{
, r0 b5 h9 n: J8 H  \  d  //PIP_ADAPTER_INFO结构体指针存储本机网卡信息
. a, d+ [6 q) t' g) q; R  PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO();
8 g6 Q0 `( P3 k6 H5 a  //得到结构体大小,用于GetAdaptersInfo参数
( ~/ ]& y7 z2 }$ F  unsigned long stSize = sizeof(IP_ADAPTER_INFO);+ F0 w2 H2 H2 f0 p; B% Q% S/ z
  //调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量;其中stSize参数既是一个输入量也是一个输出量
3 Y: K0 K# P  }  int nRel = GetAdaptersInfo(pIpAdapterInfo,&stSize);
' h1 J, `+ c5 U5 J% ]  N0 l" ^  //记录网卡数量
$ C* v' S' C! v( l: n, g3 g  int neTCardNum = 0;+ A  W" |  x' r& V! H
  //记录每张网卡上的IP地址数量" m9 y+ ]  E5 m
  int IPnumPerNetCard = 0;6 u1 J( R: {, j, d, h+ M3 W$ j
  if (ERROR_BUFFER_OVERFLOW == nRel)
9 N0 }8 {7 C% u: w! U  {
$ \. C( n- C, G$ S% v2 Z4 M) h    //如果函数返回的是ERROR_BUFFER_OVERFLOW
6 V1 |2 r3 g* m3 r, ^; X" y    //则说明GetAdaptersInfo参数传递的内存空间不够,同时其传出stSize,表示需要的空间大小7 ^/ ^( W/ f- u4 Z
    //这也是说明为什么stSize既是一个输入量也是一个输出量
# V& R! L" t4 y6 a0 Z! Q( Q    //释放原来的内存空间4 K: z% {% L) q: R
    delete pIpAdapterInfo;3 `9 r% ~! [2 H0 W4 y9 s
    //重新申请内存空间用来存储所有网卡信息
8 ?4 c9 H( e' Y3 E; s) k    pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize];1 T2 X+ m# P5 k1 n+ F
    //再次调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量+ x5 \% g" m5 D# j* Z- H& c, Y0 g( U
    nRel=GetAdaptersInfo(pIpAdapterInfo,&stSize);  1 v: F, v. ?! p% O2 q; u0 N' M
  }4 @' _( f, ^! l1 v8 E- N
  if (ERROR_SUCCESS == nRel)( w8 b1 P: U$ H
  {
* a0 u5 K0 h$ M8 A" {3 }    //输出网卡信息4 P  S- E0 H7 l6 K* k; c
     //可能有多网卡,因此通过循环去判断. l9 V0 w" B" x; ]' m
  while (pIpAdapterInfo)
/ |& `7 p/ h( w; w/ i& @) {  {) }+ M" C0 L# W/ z" E( _
    cout<<"网卡数量:"<<++netCardNum<<endl;5 U3 F1 P* s6 p: \
    cout<<"网卡名称:"<<pIpAdapterInfo->AdapterName<<endl;
. v! P3 p8 c( I5 ^    cout<<"网卡描述:"<<pIpAdapterInfo->Description<<endl;
3 r# s9 q4 f( {, ^    switch(pIpAdapterInfo->Type)
( |' a) y2 n( G$ R    {2 F/ M  J2 v7 V. d
    case MIB_IF_TYPE_OTHER:( ?& q! M  n* [1 K6 Y& x) n
      cout<<"网卡类型:"<<"OTHER"<<endl;
8 L! F5 k* Z" C1 c      break;
  W7 ~- e6 N- d* k+ L    case MIB_IF_TYPE_ETHERNET:
) a0 Y; V  ~+ S% [1 J+ {9 ^      cout<<"网卡类型:"<<"ETHERNET"<<endl;6 f+ @4 j! w* u* ~! m2 C
      break;
2 T1 W6 r6 ]& L" `/ g  K    case MIB_IF_TYPE_TOKENRING:! [; p5 O, F  G, y
      cout<<"网卡类型:"<<"TOKENRING"<<endl;
7 M' V$ h: p0 V& A      break;. K2 w; e8 M0 Q" L6 r0 \
    case MIB_IF_TYPE_FDDI:7 Q% q" o. {5 t, n' W( [$ n
      cout<<"网卡类型:"<<"FDDI"<<endl;, Q4 Z" f  R2 Q; T% \2 w9 W) y
      break;3 u0 N: `$ d0 f: \0 V4 \
    case MIB_IF_TYPE_PPP:  t9 d0 h( o/ \
      printf("PP\n");
) U6 Z4 b2 p# U# C      cout<<"网卡类型:"<<"PPP"<<endl;& j+ {/ E  P: l  K
      break;
/ n0 Z. ^8 R2 a8 e/ M    case MIB_IF_TYPE_LOOPBACK:
# m5 D6 `: D4 Y4 x* [% m- l      cout<<"网卡类型:"<<"LOOPBACK"<<endl;
$ W. V2 M( x5 l  ^      break;3 _+ v. Y) I% J- m. C* P/ I
    case MIB_IF_TYPE_SLIP:
) w3 {8 \% W; i; o      cout<<"网卡类型:"<<"SLIP"<<endl;
2 ?1 H/ }1 b0 \' p      break;
, }; x$ a$ P8 \. j. Y2 N9 @    default:
: K2 w  Y# u4 ?! O& f- w: r, B
4 V! X" G3 d( Q5 \# a) @( _' |) M      break;
+ S' u% l# X5 d" R) J/ C0 c! r    }! A4 z9 e- r8 ~* \# b/ D9 T; Q& l: \
    cout<<"网卡MAC地址:";! D# N, \) p2 i+ H
    for (DWORD i = 0; i < pIpAdapterInfo->AddressLength; i++)3 q& b  U+ U! Y. E7 ?8 m/ V. _( ^
      if (i < pIpAdapterInfo->AddressLength-1)0 L1 U6 @! R$ f2 d
      {4 z# e. t6 g6 Z- b5 r2 V7 Q
        printf("%02X-", pIpAdapterInfo->Address);
4 }9 m5 @& Z. X& ?2 {$ q2 J# ?      }; H* y2 R+ I: E$ U7 K% @; d/ N
      else1 J, g! y! t) |# X1 K
      {
/ }7 q0 q) C6 r3 w) U        printf("%02X\n", pIpAdapterInfo->Address);
8 ?3 ~; @  d  s      }
# J- x, a) ~) ^: M! @      cout<<"网卡IP地址如下:"<<endl;
* V( G* R, d  t7 g" f4 n, S. R6 m" Y      //可能网卡有多IP,因此通过循环去判断5 n& U+ S, T& ?7 p) J
      IP_ADDR_STRING *pIpAddrString =&(pIpAdapterInfo->IpAddressList);/ }7 M$ s' s7 |  E6 V; B
      do) \4 K6 _6 w4 q% }* l) l) ?0 q! a
      {
$ K9 r; I. L; v1 Y        cout<<"该网卡上的IP数量:"<<++IPnumPerNetCard<<endl;2 ^+ ^6 d5 N) m0 U
        cout<<"IP 地址:"<<pIpAddrString->IpAddress.String<<endl;6 H$ F4 d* j* D6 s" C2 `$ _
        cout<<"子网地址:"<<pIpAddrString->IpMask.String<<endl;
! U, w+ z+ Y$ [% c9 x: b" e9 H( `0 D        cout<<"网关地址:"<<pIpAdapterInfo->GatewayList.IpAddress.String<<endl;: I5 }# H- K) ?; f# e& ^& ~! q
        pIpAddrString=pIpAddrString->Next;
# q& W, C* |% }0 f      } while (pIpAddrString);2 u* B7 {9 V3 E
      pIpAdapterInfo = pIpAdapterInfo->Next;$ c2 y# j6 O% Q  M! w0 m4 V) O, T( ?
      cout<<"--------------------------------------------------------------------"<<endl;1 G5 P* \0 n& E7 _
  }, _1 k# U; o, T
   6 F3 c) _- e6 ^9 e4 v  o. z5 w6 E) s
  }6 h9 O6 ~0 Q; c# Y! o* L0 [
  //释放内存空间9 ?3 C+ e- y1 ^  n$ c
  if (pIpAdapterInfo)
' i/ f% j4 z' H4 a5 Y. i$ L  {2 u( |; k" v7 J  Q  u2 [
    delete pIpAdapterInfo;
( ]9 ^) N9 l# l0 ?2 ?6 N  }
( `9 @8 a. r+ A- Z' s9 p  8 m( |, {( @4 A! s6 v
  return 0;6 u4 q2 I2 d( w- Z% ~( A
}
% R* m( f1 n3 Y. g7 }& p2 v# c( P! [
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了