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

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

[复制链接]

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

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

admin 楼主

2017-10-17 21:05:45

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

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

x
#include <WinSock2.h>
* Y$ ~8 P3 w( u+ E$ L) J7 _* |: c#include <Iphlpapi.h>8 y4 p7 V( j0 t) K2 _' F
#include <iostream>5 j" m* I) ?9 W8 q! r; |8 Y# D; E
using namespace std;
+ [* n9 j2 X5 Q  e' x#pragma comment(lib,"Iphlpapi.lib") //需要添加Iphlpapi.lib库6 V0 V: }" z2 [9 }

5 Q( q% d; r- K9 [% [int main(int argc, char* argv[])$ {8 L( q6 I3 S) g! ]$ p8 R
{( f4 o9 L: ]6 ?/ `: m/ _, |; @* V
  //PIP_ADAPTER_INFO结构体指针存储本机网卡信息
- }& F; `* r' c8 v; f  PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO();2 Y$ m" l0 Z4 k2 g2 H
  //得到结构体大小,用于GetAdaptersInfo参数
) q8 T% i7 y4 u" z! j: r  unsigned long stSize = sizeof(IP_ADAPTER_INFO);+ o* {6 o. [% b0 b# U* P
  //调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量;其中stSize参数既是一个输入量也是一个输出量
2 ]" H" m; A; ~  M  int nRel = GetAdaptersInfo(pIpAdapterInfo,&stSize);
4 H: }$ s) R/ v. {  //记录网卡数量
6 {0 ?  W4 J/ M  int neTCardNum = 0;
' H1 j% }. ?! b' x) @  //记录每张网卡上的IP地址数量
; F- o' [9 ?* c  int IPnumPerNetCard = 0;
- U. z* z' S5 t- K, P( s- v  if (ERROR_BUFFER_OVERFLOW == nRel)
- O: @2 J9 }: H1 O* @  {
/ M2 c7 f. s% P& j6 E$ I    //如果函数返回的是ERROR_BUFFER_OVERFLOW5 ^1 \: p& l9 l6 M; D
    //则说明GetAdaptersInfo参数传递的内存空间不够,同时其传出stSize,表示需要的空间大小5 L! L9 i" U# R  K3 [0 }4 w& Y; J" o
    //这也是说明为什么stSize既是一个输入量也是一个输出量  S- S, V& J* O1 s# [% U9 X, [3 Z
    //释放原来的内存空间
1 s$ y$ i( m" u+ O: S    delete pIpAdapterInfo;5 L4 F) {& G- a- u: C1 h% B
    //重新申请内存空间用来存储所有网卡信息
0 u; d& r4 p& o6 N" K% ]! _    pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize];8 z# ]! E6 ~7 D: K! ~/ ^
    //再次调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量
+ d: r3 |; C0 O4 r' B    nRel=GetAdaptersInfo(pIpAdapterInfo,&stSize);  4 f/ t1 E6 _$ H) A1 K+ A6 I
  }+ L4 ?, c0 i) _: C- O% d
  if (ERROR_SUCCESS == nRel)
) ]: y2 J2 y9 s) h# A  {) o2 z, P- a7 @; v- T: _. F! N
    //输出网卡信息, s; F* ^) T1 j/ _
     //可能有多网卡,因此通过循环去判断# f" f, v% i, a9 h; p
  while (pIpAdapterInfo)3 p( S8 l' g  \$ r1 _! N
  {/ x  \% F9 c2 x+ q( y
    cout<<"网卡数量:"<<++netCardNum<<endl;
, Y" ]' y7 h- Y% K6 p  r* y# @    cout<<"网卡名称:"<<pIpAdapterInfo->AdapterName<<endl;* R7 g9 f6 ~8 s
    cout<<"网卡描述:"<<pIpAdapterInfo->Description<<endl;1 \9 |* B+ F- X7 N2 K3 W
    switch(pIpAdapterInfo->Type)  K; e* j) |+ c( @, i/ o
    {
0 c4 K' j4 P5 A  a    case MIB_IF_TYPE_OTHER:
, x6 ?4 L  }7 K      cout<<"网卡类型:"<<"OTHER"<<endl;3 l+ ^8 A; i9 F
      break;
0 D2 }5 O; w7 B0 |# \: W    case MIB_IF_TYPE_ETHERNET:3 z0 D# i8 Y# b. W+ u) j% c
      cout<<"网卡类型:"<<"ETHERNET"<<endl;, _& Q! d4 Z% s  w, R* ^2 v# j
      break;
/ x+ m. h( _; X7 n( T    case MIB_IF_TYPE_TOKENRING:
- w  f% l' T2 Q9 h& F      cout<<"网卡类型:"<<"TOKENRING"<<endl;5 c* J% z  L3 y+ m. @1 d
      break;
0 l3 T) i( L. O' k) k" m    case MIB_IF_TYPE_FDDI:/ D: L# h- U6 g2 q; H
      cout<<"网卡类型:"<<"FDDI"<<endl;
" ~8 N# M% g% e% y1 w5 \0 s      break;
8 j. f# e: R/ y, Y    case MIB_IF_TYPE_PPP:
% V2 ]; I: l+ h6 G3 }- w      printf("PP\n");
) }( s: }# h& z) {; m% a4 L$ a* w      cout<<"网卡类型:"<<"PPP"<<endl;" ?: d9 n0 i+ L3 [4 M
      break;
. d3 m4 ~8 l+ t2 i) f4 L' }' {    case MIB_IF_TYPE_LOOPBACK:
' N% R" g/ `7 N) p" f2 d9 @. ^      cout<<"网卡类型:"<<"LOOPBACK"<<endl;& u' k7 y3 s/ d( c7 T$ i! M% _, U
      break;
9 N3 l, ]6 R/ @    case MIB_IF_TYPE_SLIP:
7 @, ?& F/ g5 Z9 f. }      cout<<"网卡类型:"<<"SLIP"<<endl;6 N( t( K* o' _5 s4 z" O
      break;. S2 U) Q5 V8 y
    default:! i& H/ a2 Z( f1 J

5 }3 i5 A* p( J      break;. g. Z8 ]; `% U0 e3 F
    }- D" U+ e" }* v" \2 r
    cout<<"网卡MAC地址:";+ I% H# B1 X# \* j: @
    for (DWORD i = 0; i < pIpAdapterInfo->AddressLength; i++)" N, i% d3 K8 s. O8 I! u
      if (i < pIpAdapterInfo->AddressLength-1)
% Z1 S4 J) f; m& v( M0 d      {
" _+ h1 C1 _: C6 f" n        printf("%02X-", pIpAdapterInfo->Address);* d& T( I! B: h
      }/ |, z& S( q" s! _3 B! r
      else
. X% F& B( J9 F5 O      {
! Y7 H0 v* q! p: _+ s( n1 F        printf("%02X\n", pIpAdapterInfo->Address);' [) X$ \, x: q: O
      }8 Y4 g; u9 ^3 ~! r; H
      cout<<"网卡IP地址如下:"<<endl;" q( P1 v  D5 D) W
      //可能网卡有多IP,因此通过循环去判断
/ J/ n5 E/ c6 P% `      IP_ADDR_STRING *pIpAddrString =&(pIpAdapterInfo->IpAddressList);
( b/ s$ G& Q. R  @4 T# C      do
, a$ W! ~( j  y$ u      {
$ B) ]; U0 q  Z        cout<<"该网卡上的IP数量:"<<++IPnumPerNetCard<<endl;
+ u# l! V+ F5 h; p9 t( s* Y0 x/ T        cout<<"IP 地址:"<<pIpAddrString->IpAddress.String<<endl;
8 c( s  }% _, Z" y1 F* J3 @, a        cout<<"子网地址:"<<pIpAddrString->IpMask.String<<endl;
; u7 H2 q7 _) O; c9 u3 d8 B        cout<<"网关地址:"<<pIpAdapterInfo->GatewayList.IpAddress.String<<endl;
* ?" b2 L5 p6 B& e2 \; b6 d        pIpAddrString=pIpAddrString->Next;0 |) F" ?' [3 I( u
      } while (pIpAddrString);
) A% x! H- z+ ~0 E; E      pIpAdapterInfo = pIpAdapterInfo->Next;) i$ [7 S* T# U! \# H$ a
      cout<<"--------------------------------------------------------------------"<<endl;# d% B/ K# K: O1 R
  }
+ V3 n/ {' C+ }# S" F4 w  l, o   ! \6 K* O% f) r* ?3 [% h7 D2 n
  }
: s$ a( V, K3 k( k7 K3 P4 q  //释放内存空间& A4 ?- O- G; ?  e" {9 |) m# B
  if (pIpAdapterInfo)- G3 b, p5 N8 B  Z
  {& [+ p) g; H/ x
    delete pIpAdapterInfo;; Z' j- f& z6 q& R5 t6 d
  }
) N" G5 F6 D  p; }5 |$ x  
( d! b! C5 r' t# I( D  G' u  return 0;. f7 p- k$ k0 I  q4 o7 e7 r
}
/ }  O' U7 d& _# s. k$ R+ a0 m
! i/ w, [/ x* D9 I) R" s& n; T4 ^
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了