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

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

[复制链接]

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

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

admin 楼主

2017-10-17 21:05:45

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

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

x
#include <WinSock2.h>
" B9 X. S5 y) s0 @1 }8 ?) w#include <Iphlpapi.h>7 a' N1 g% \+ |: w# S; t5 b) c
#include <iostream>
% b0 E7 w3 t4 i& b6 R0 j+ tusing namespace std;# V* Y# F4 {* [' X/ s
#pragma comment(lib,"Iphlpapi.lib") //需要添加Iphlpapi.lib库4 p; a3 m) k" G% ^
2 q. f6 H* [9 ], m" b- g
int main(int argc, char* argv[])
2 i( r' a; Q, f& K, @. E{& L* j2 o2 z7 o* w1 g% Q
  //PIP_ADAPTER_INFO结构体指针存储本机网卡信息3 a; C! S' E7 w
  PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO();. c$ G, O2 A% }
  //得到结构体大小,用于GetAdaptersInfo参数; W4 s  r9 N; m
  unsigned long stSize = sizeof(IP_ADAPTER_INFO);( p& |: G: l2 I! ^" q
  //调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量;其中stSize参数既是一个输入量也是一个输出量0 I+ H  M# l$ |0 m
  int nRel = GetAdaptersInfo(pIpAdapterInfo,&stSize);& o! y% s$ y! H& n  N5 I' n( D6 ~
  //记录网卡数量
% H9 n: I9 M: Q) L  I1 d( _, x% Q  int neTCardNum = 0;
) |4 F8 I" d- C  Y$ v$ Y  //记录每张网卡上的IP地址数量; p; v' y# d( C; M( z
  int IPnumPerNetCard = 0;
' \) V" Z$ j: P! L, \  if (ERROR_BUFFER_OVERFLOW == nRel)+ Q% b& x$ S1 w* |5 e4 m
  {0 c) _5 h. y5 i) S4 S6 t
    //如果函数返回的是ERROR_BUFFER_OVERFLOW
$ [, D8 b! _% E- P$ Y( a+ O    //则说明GetAdaptersInfo参数传递的内存空间不够,同时其传出stSize,表示需要的空间大小8 ~! r1 B9 P' |
    //这也是说明为什么stSize既是一个输入量也是一个输出量
* N: ~' E; ]8 g5 n' O8 S    //释放原来的内存空间, w* [, y) K# W8 z
    delete pIpAdapterInfo;
0 Z. T0 [$ c7 I2 p    //重新申请内存空间用来存储所有网卡信息: I4 {, k$ ^$ D  _, G
    pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize];
1 b7 ~! M9 b$ x    //再次调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量
; n9 T' x2 l: ~$ y0 z$ K/ f7 s    nRel=GetAdaptersInfo(pIpAdapterInfo,&stSize);  , D/ `4 m2 ]' l# G5 L
  }
. [4 m1 i% L6 S% l( l  if (ERROR_SUCCESS == nRel)
0 Y6 a# A6 ^' {$ K$ d# m% k# }  {* ]& ~# \& x, v6 L- p
    //输出网卡信息. v, o: T/ S6 J# I
     //可能有多网卡,因此通过循环去判断4 [  L3 T% Q0 e* L+ n
  while (pIpAdapterInfo)( Z  b  e7 _- q8 }
  {6 B6 _# V6 @, m
    cout<<"网卡数量:"<<++netCardNum<<endl;
9 F8 G2 b3 u5 T3 D! x) u+ ?" M+ R    cout<<"网卡名称:"<<pIpAdapterInfo->AdapterName<<endl;
# o  K! ~9 l% r9 R    cout<<"网卡描述:"<<pIpAdapterInfo->Description<<endl;
" D" G$ g. {* W8 P    switch(pIpAdapterInfo->Type)
5 _7 Y' f  `; b8 n; L# }4 u    {
! }( p% U3 K# W; a, N    case MIB_IF_TYPE_OTHER:4 s6 y2 ~( N3 k& k% L
      cout<<"网卡类型:"<<"OTHER"<<endl;
/ Y( y7 s5 u3 b0 W' f& k; U      break;; }% @5 z' t' C# j' ^
    case MIB_IF_TYPE_ETHERNET:
  g1 [* n1 P  h! B4 f6 l% S      cout<<"网卡类型:"<<"ETHERNET"<<endl;/ r8 J9 u6 p. e  {- a# R" W
      break;
; k. ?3 ^6 ?: \& j    case MIB_IF_TYPE_TOKENRING:
% J  h# Q) y: ~) G  E      cout<<"网卡类型:"<<"TOKENRING"<<endl;  ]1 O. e" K" v/ n: Q$ [& L
      break;
$ r# k: f) `7 E  _% s    case MIB_IF_TYPE_FDDI:8 r( B1 S% k9 H/ W  L
      cout<<"网卡类型:"<<"FDDI"<<endl;6 c5 m- O, {' z/ r! x
      break;- a: W# R' N9 h3 q3 [) [& M
    case MIB_IF_TYPE_PPP:
" D3 @6 l1 T- P. g% f: \2 e      printf("PP\n");
  R; Q9 C0 E# M* j7 ~! L      cout<<"网卡类型:"<<"PPP"<<endl;2 K6 `( f0 k3 d4 k; C. f) I
      break;2 t( @; h9 e# W
    case MIB_IF_TYPE_LOOPBACK:3 r( m; `" c: \+ L- j  [
      cout<<"网卡类型:"<<"LOOPBACK"<<endl;
! K' W) _0 S* N2 c0 }0 ?      break;& f2 h" \: B: f. c* Q! n+ I% G. c
    case MIB_IF_TYPE_SLIP:
; }+ y2 V/ ~$ g' O      cout<<"网卡类型:"<<"SLIP"<<endl;
2 K* A5 V9 U2 i) U( ^+ v      break;
( m! u. L7 @" L* v% |    default:5 s& ?5 M6 g" |6 ?

2 O  B8 N- W' d: x9 Q- Q) Y- J/ G      break;
3 {0 z( U# B8 \/ `" A. z& z4 d9 U    }
  F7 O) K  O$ w5 S" J3 N/ E    cout<<"网卡MAC地址:";" |3 l2 \, N# V% C+ e- z
    for (DWORD i = 0; i < pIpAdapterInfo->AddressLength; i++)+ D+ N6 p# X- Z9 O( a, G( x& _- X4 `
      if (i < pIpAdapterInfo->AddressLength-1)/ m( @+ ?7 K3 ^
      {
+ m* x# x7 f9 _9 y7 V  h9 v        printf("%02X-", pIpAdapterInfo->Address);+ x( j; P8 I2 v
      }
3 m  J8 v3 Q% N; d; L      else& R4 g5 X8 {) M
      {/ `7 E0 u% [! ]- q+ a* J6 ?$ a+ k
        printf("%02X\n", pIpAdapterInfo->Address);% c* S: I2 |/ L; O0 K: J
      }
$ p% E2 C+ k' [% U+ ~      cout<<"网卡IP地址如下:"<<endl;
* I" x; d' k4 N3 F( V7 z      //可能网卡有多IP,因此通过循环去判断( [( P9 V. m2 Q0 h$ t9 ^: V2 w7 b
      IP_ADDR_STRING *pIpAddrString =&(pIpAdapterInfo->IpAddressList);
: o8 q; A/ h! Y5 G      do* E; h; h) Z# \, I1 S2 T, n9 w
      {
& ~/ U/ t1 p6 J( n1 G7 W6 m. R        cout<<"该网卡上的IP数量:"<<++IPnumPerNetCard<<endl;
% g1 q# k" n+ E" Q        cout<<"IP 地址:"<<pIpAddrString->IpAddress.String<<endl;! }4 H- P0 M3 |4 a* P2 Q
        cout<<"子网地址:"<<pIpAddrString->IpMask.String<<endl;( W: u6 i: H% j& a* }+ C+ }! x
        cout<<"网关地址:"<<pIpAdapterInfo->GatewayList.IpAddress.String<<endl;
$ K% s. q5 Y( `; a8 L        pIpAddrString=pIpAddrString->Next;
1 {- y5 H: [6 B  q      } while (pIpAddrString);
5 g" K/ p* _' y' @9 N; Z! _& p" |      pIpAdapterInfo = pIpAdapterInfo->Next;5 w  E( S2 f1 z9 }
      cout<<"--------------------------------------------------------------------"<<endl;
3 X1 D3 w3 E; f' |3 B: b% E7 Q; C  }
7 g5 W5 j$ S1 z, S   5 j. J4 g% q/ a
  }
5 `$ |& O; X7 h  //释放内存空间
& Y5 t" u0 U$ V2 G  if (pIpAdapterInfo)4 u% y" @8 d8 f% m- s
  {5 ]% h" A: s- d6 z6 ?5 P
    delete pIpAdapterInfo;
+ ]+ l  O: U7 h% T  }
# T1 o% h& C6 S: F3 U5 Q  N0 h  , m& [6 r: m- |5 K1 z* L
  return 0;
0 n2 W3 |+ Z0 v! r; E2 a+ B9 J}: L, z/ h' r, B% R; u0 T7 I
2 x, Q( @3 E" o1 y
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了