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

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

[复制链接]

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

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

admin 楼主

2017-10-17 21:05:45

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

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

x
#include <WinSock2.h>
, d" R2 u, V# W( L2 O#include <Iphlpapi.h>0 b- h6 k  M& ^" ]
#include <iostream>( z5 `6 A, V4 Q0 A% r5 A( U0 m
using namespace std;6 ^% Q, v+ `: t+ L) h1 e6 [
#pragma comment(lib,"Iphlpapi.lib") //需要添加Iphlpapi.lib库. z; N5 j% y, f+ {* ~9 U. u% E. ^

4 h$ N1 B9 u2 a  q# X) cint main(int argc, char* argv[])
. P9 W( @! d6 R, N  _9 C, L7 F{
8 V. f+ z/ _7 M# t& x- M) n7 Y  //PIP_ADAPTER_INFO结构体指针存储本机网卡信息& f- A$ d# G5 b5 C. p& Z' M  z5 ?
  PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO();3 S- L1 ~! i8 A- N
  //得到结构体大小,用于GetAdaptersInfo参数, K6 e8 b# y9 v
  unsigned long stSize = sizeof(IP_ADAPTER_INFO);
& g3 O- f+ e8 G# A3 m* b" I  //调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量;其中stSize参数既是一个输入量也是一个输出量! ~" G5 A/ X3 L
  int nRel = GetAdaptersInfo(pIpAdapterInfo,&stSize);+ @) U* Q: V" q1 ^. t
  //记录网卡数量
& T( |8 F. r' k, l! Z  int neTCardNum = 0;: G# D3 e3 C5 K& v3 {' h/ h4 r
  //记录每张网卡上的IP地址数量! `! {! D3 M+ T! t- Q
  int IPnumPerNetCard = 0;
% _! L; T* W5 P1 e% J6 |8 M  if (ERROR_BUFFER_OVERFLOW == nRel)
) q4 u. v1 J6 A. i' g$ v) X1 a, [! M  {3 s, \( F, {2 @$ p0 y% k" R
    //如果函数返回的是ERROR_BUFFER_OVERFLOW. f9 H2 d3 m& Q' h6 |3 r$ J. j
    //则说明GetAdaptersInfo参数传递的内存空间不够,同时其传出stSize,表示需要的空间大小
3 M) I/ k( _/ l9 x% ~$ O/ W" n& r9 O    //这也是说明为什么stSize既是一个输入量也是一个输出量
, X, z6 _8 H! [% u9 h8 p    //释放原来的内存空间/ O  O: p, x. h6 K
    delete pIpAdapterInfo;# U/ C: n# E7 ^2 Z5 x" U* R4 ?
    //重新申请内存空间用来存储所有网卡信息
! C  Y9 `2 |3 a. ]8 t3 x" x    pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize];
( `. n" o, I5 M+ ?) L  I    //再次调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量
. S) E2 y: f  Q    nRel=GetAdaptersInfo(pIpAdapterInfo,&stSize);  / U2 V: P7 }- O+ d' j
  }
# ~; L" U+ U. z! S' ?/ |3 h9 y  if (ERROR_SUCCESS == nRel)
; W! x4 h) w6 O  {. x' ?1 Y3 C: P4 {
    //输出网卡信息9 h: j% j; ^. ~- I* @0 F2 W/ v
     //可能有多网卡,因此通过循环去判断
6 L/ w/ I# n1 M5 y; z6 v  while (pIpAdapterInfo)+ S, I; c0 L. Y2 X
  {. c0 e" b" w2 U% c8 N6 B: M
    cout<<"网卡数量:"<<++netCardNum<<endl;+ x' c9 K, Q; s% U
    cout<<"网卡名称:"<<pIpAdapterInfo->AdapterName<<endl;3 [( B  M- L: H3 L7 h( @. h5 q
    cout<<"网卡描述:"<<pIpAdapterInfo->Description<<endl;
- r. E+ I8 T* q% r    switch(pIpAdapterInfo->Type)* E: t- @2 y+ M8 p+ j+ c; `+ q
    {
8 C4 `" n3 w* n/ Z' b3 c# p: u- ^    case MIB_IF_TYPE_OTHER:
8 X7 P, X7 k& g' K. m" I      cout<<"网卡类型:"<<"OTHER"<<endl;( v% {7 W. j& T# G4 q  a6 G% O6 K
      break;
3 j- H) o' W% O1 E# d0 S    case MIB_IF_TYPE_ETHERNET:
0 D3 j6 X2 p) v- v      cout<<"网卡类型:"<<"ETHERNET"<<endl;/ ?' J/ ~" ~. m- Z$ y& [- x
      break;
  w! Y4 ?/ \$ P- t    case MIB_IF_TYPE_TOKENRING:- F2 B: S. m" W. p. w8 R0 J! y
      cout<<"网卡类型:"<<"TOKENRING"<<endl;- M+ r( T9 n& h% m: [
      break;9 [( q& L* J" n# b5 r+ i; Q8 M
    case MIB_IF_TYPE_FDDI:5 @8 A0 u; a1 b' C- ~0 u) i
      cout<<"网卡类型:"<<"FDDI"<<endl;
( `* N0 _0 Y2 e6 G: K      break;1 A- r: j. P  o1 y* O) |
    case MIB_IF_TYPE_PPP:
% i3 A! `: E; B; V9 \      printf("PP\n");
4 U& M0 h. J; f1 P" W5 h# N$ a, G+ n      cout<<"网卡类型:"<<"PPP"<<endl;1 _, F4 U# m! o' b6 x* O
      break;
( ^% Q6 {  V2 p1 h, `  R( H    case MIB_IF_TYPE_LOOPBACK:# p  d. Y& j7 C/ X& W
      cout<<"网卡类型:"<<"LOOPBACK"<<endl;
, U, R" e' M% a& `+ l8 i      break;
" v3 X: s/ ?( h+ b8 ~2 W8 r$ k% i8 H    case MIB_IF_TYPE_SLIP:
# B: y  a2 F+ ?7 \( Y      cout<<"网卡类型:"<<"SLIP"<<endl;. M' T- z& X& B" L' l
      break;
$ c  I: `1 T; M% ]  H    default:
( G* k  i# {- @, P! P" u! Q) K$ K, x& Q5 j
      break;
% D) G. ?  P; d6 G* i$ `0 q3 [    }
- K  I. X' }& W2 T    cout<<"网卡MAC地址:";9 e$ d8 P: z9 i6 B
    for (DWORD i = 0; i < pIpAdapterInfo->AddressLength; i++)' A9 `  N1 J. `7 e
      if (i < pIpAdapterInfo->AddressLength-1)
7 G% x+ x8 n# v1 q; N* g1 M* K      {. M9 F! P6 l1 x1 {9 D* n' b6 ]& u
        printf("%02X-", pIpAdapterInfo->Address);
0 ?: V0 G& S; ?3 L# Y* z      }
/ O9 _) C2 Z1 l$ E& n- f; C9 s# |% d      else1 g7 x! H9 C& _, G: o
      {
$ d  ~0 ~& M7 P' _/ P/ O* e        printf("%02X\n", pIpAdapterInfo->Address);, L/ N9 N; e* b7 U% X
      }, W/ y0 n% M. h( q& w/ |6 H' J
      cout<<"网卡IP地址如下:"<<endl;- E) y  s! K0 e3 B3 }3 |
      //可能网卡有多IP,因此通过循环去判断
8 Q. U1 _# u) U- T; e      IP_ADDR_STRING *pIpAddrString =&(pIpAdapterInfo->IpAddressList);
7 [; B! s( c7 v2 }2 S. ^      do: D. M! Y. i9 j* B* L  S; I
      {
+ l& r+ w( ^7 B" ^" J        cout<<"该网卡上的IP数量:"<<++IPnumPerNetCard<<endl;! x4 T& e# y1 \( H1 U
        cout<<"IP 地址:"<<pIpAddrString->IpAddress.String<<endl;
1 x3 C; A/ R: u0 b( a' W- A/ \        cout<<"子网地址:"<<pIpAddrString->IpMask.String<<endl;0 V& W2 `$ D* v6 a- x+ l- B, I# K
        cout<<"网关地址:"<<pIpAdapterInfo->GatewayList.IpAddress.String<<endl;( N, B$ c. A6 o% B0 K/ X
        pIpAddrString=pIpAddrString->Next;* L& J  K3 S2 c8 A5 B
      } while (pIpAddrString);* y  r; @* h3 C9 V# o' [
      pIpAdapterInfo = pIpAdapterInfo->Next;
3 |4 z+ t1 g4 Q4 ~+ f      cout<<"--------------------------------------------------------------------"<<endl;# \8 p2 ~2 ?' ^* i- |' M( o* z
  }
: o# o7 s0 h2 w' s   
% l# k* `, ]% G8 W  }7 T/ Z( t8 f1 M' o9 ~, U7 E
  //释放内存空间7 d- l% B( y/ V% Y" F' o$ |
  if (pIpAdapterInfo)$ `+ b& o: |8 v9 J2 E) d( T
  {! k) d- {5 \6 n$ q
    delete pIpAdapterInfo;  ?- ]3 H* a' V- ^5 b* M$ J
  }1 m4 U9 o$ b' I  N9 @! I+ G
  
. ~& M9 W5 t# q  return 0;# u3 |: X* A5 E$ d' D
}
4 E5 W6 A- o$ m1 a# i4 X# y% r* F0 j: y, S2 K# @2 M2 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二次开发专题模块培训报名开始啦

    我知道了