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

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

[复制链接]

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

2470

主题

1275

回帖

8万

积分

管理员

PLM之家站长

积分
82172
QQ
发表于 2017-10-17 21:05:45 | 显示全部楼层 |阅读模式

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

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

x
#include <WinSock2.h>
$ v) {+ N4 S  s4 I#include <Iphlpapi.h>
1 ]: o3 f* l& l; W6 t$ R#include <iostream>
9 U, x: i* v' Y+ yusing namespace std;) c1 Z% B" g! i+ |, q
#pragma comment(lib,"Iphlpapi.lib") //需要添加Iphlpapi.lib库
0 e4 k6 m8 W4 D8 b2 Q7 q. b1 L5 c9 I
8 k& h$ t% y) i& ~9 k. lint main(int argc, char* argv[])
: C  _/ C5 u! y# C. i# L. |{6 k, B0 D, ~1 n4 n
  //PIP_ADAPTER_INFO结构体指针存储本机网卡信息6 ^% {! T. _" N" `* D& J5 Z* y/ E
  PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO();7 J) h  V; ?" W, Y5 r5 @0 T
  //得到结构体大小,用于GetAdaptersInfo参数
7 ~5 A: }6 i/ [$ T( P$ X  unsigned long stSize = sizeof(IP_ADAPTER_INFO);
! a9 X" ?& p& N  //调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量;其中stSize参数既是一个输入量也是一个输出量+ m/ B8 \. U) R" D+ a
  int nRel = GetAdaptersInfo(pIpAdapterInfo,&stSize);
, P7 T- l$ A8 Q! Q" J6 p  //记录网卡数量
, w4 s) N' |5 @, L. b  int neTCardNum = 0;
4 ^6 |( ]$ B9 ^  //记录每张网卡上的IP地址数量
! u# ~) C4 @3 h- z/ a  d  int IPnumPerNetCard = 0;8 P% l8 {$ t1 N) _! T4 O
  if (ERROR_BUFFER_OVERFLOW == nRel)& Q, W8 m) f5 S; ?  m; z5 s, {
  {
. t' W: t) z1 Q7 t- o, X    //如果函数返回的是ERROR_BUFFER_OVERFLOW
4 C: }- @, Y2 h" \    //则说明GetAdaptersInfo参数传递的内存空间不够,同时其传出stSize,表示需要的空间大小1 ]2 a9 D( b3 K7 F
    //这也是说明为什么stSize既是一个输入量也是一个输出量2 e: R. F7 u+ x" D
    //释放原来的内存空间" y& a4 |9 L+ S1 x+ I
    delete pIpAdapterInfo;
  t$ y7 G* F& K& {; A# m% B2 N    //重新申请内存空间用来存储所有网卡信息
9 H+ Y5 k/ f5 j7 \    pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize];
( w! B: L& X$ |% a. C    //再次调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量8 ^8 z! p8 F$ D; v* |: Y$ M
    nRel=GetAdaptersInfo(pIpAdapterInfo,&stSize);  
& o3 c3 S4 W, G% i7 K, k" o$ r% K  }
0 M: ?, l6 L6 ]. {& x  if (ERROR_SUCCESS == nRel)
( E2 Y3 B3 ^/ z1 f& B  {
, N/ W9 N/ D- b& Y3 v+ d( u    //输出网卡信息% I; [' y) r4 b2 W" b4 }9 m9 c
     //可能有多网卡,因此通过循环去判断
/ }) R, Q. M' F1 R  while (pIpAdapterInfo)
- b: K2 `" ~) g' L( r5 q1 S& T  {) N1 Q9 F2 y- j1 U+ R
    cout<<"网卡数量:"<<++netCardNum<<endl;
* R$ F5 D% Y2 G    cout<<"网卡名称:"<<pIpAdapterInfo->AdapterName<<endl;
' X$ X! x3 ^9 a( m/ I+ \2 u/ M    cout<<"网卡描述:"<<pIpAdapterInfo->Description<<endl;7 C5 G  T  a$ `6 G) d
    switch(pIpAdapterInfo->Type)! {6 T+ o2 w' t3 p) U& E. I( k0 ?" a
    {+ K) ^& }* p9 V, F- q4 x% i3 Q
    case MIB_IF_TYPE_OTHER:
( w1 c. L+ K$ N0 w( Q      cout<<"网卡类型:"<<"OTHER"<<endl;
# Z2 N# T$ K$ Z3 b$ Y& {0 B      break;
  j8 N; k! g4 M# J+ E    case MIB_IF_TYPE_ETHERNET:; Z0 O0 K2 Y' ?6 h4 _% f4 h( F% I
      cout<<"网卡类型:"<<"ETHERNET"<<endl;
$ R8 j% z% ?+ S4 B! B      break;/ \! a5 D) a; s0 m2 j5 m# m
    case MIB_IF_TYPE_TOKENRING:5 P4 E* V5 q* R) y4 n
      cout<<"网卡类型:"<<"TOKENRING"<<endl;
0 n* D6 Y$ E- T7 i0 l/ [+ k      break;
( p+ q$ Y: s2 p- N  b  h    case MIB_IF_TYPE_FDDI:$ G; \0 T* K5 o- {" L8 i
      cout<<"网卡类型:"<<"FDDI"<<endl;7 h( V7 p& S% U1 D2 ]7 q1 P0 x/ O
      break;
8 m; @4 ~( T) S    case MIB_IF_TYPE_PPP:
+ r2 g+ F6 q3 F9 O( r& O" q# M  {* g      printf("PP\n");
( q9 i9 L( ~& _: d8 S" P$ ~' A1 E8 [      cout<<"网卡类型:"<<"PPP"<<endl;& p; Z( \* K3 ?+ s% D: V
      break;7 S7 N2 s9 D- n; g3 s6 ?
    case MIB_IF_TYPE_LOOPBACK:
2 h$ }% s' k0 n8 C3 N& q      cout<<"网卡类型:"<<"LOOPBACK"<<endl;
( c( o, h3 @4 b2 [- J      break;
1 @# X2 d& _: h2 O8 F    case MIB_IF_TYPE_SLIP:
: e) M( a& L2 N8 X      cout<<"网卡类型:"<<"SLIP"<<endl;
1 \$ K: i  N% Y) ~" }* _      break;; J% W; _- z( i( d4 s% U
    default:0 V) m+ v8 W% y1 f+ D$ n; V
. i" H) _5 c" N. Z
      break;* ?% x; `' Y! v
    }' \( ^8 X0 g/ H; D9 J
    cout<<"网卡MAC地址:";
. V% r% J4 M  J, w: J    for (DWORD i = 0; i < pIpAdapterInfo->AddressLength; i++)
% ]. i! R9 f' p8 v- l/ M4 v7 K      if (i < pIpAdapterInfo->AddressLength-1)
$ @4 B' h' p$ ?3 x      {1 b) C$ T  T; M4 }3 b- r/ R
        printf("%02X-", pIpAdapterInfo->Address);/ W; ~3 p" u" T( u; p" `
      }
, c8 h0 i! L' n) {5 x4 t      else
3 Y: y$ |% J( v6 ]      {
6 J. _3 A( b! X# z# d9 r        printf("%02X\n", pIpAdapterInfo->Address);
7 D6 Z* J0 X( o      }
' H: p4 E4 ^0 a& X      cout<<"网卡IP地址如下:"<<endl;) b( |4 K0 m8 h1 U
      //可能网卡有多IP,因此通过循环去判断
- F: k5 z8 q4 |6 ]      IP_ADDR_STRING *pIpAddrString =&(pIpAdapterInfo->IpAddressList);8 |  d: i2 N7 [* n4 k% k
      do, L) W  [$ Z! @* K. w' _5 h4 w
      {6 d6 S6 V: v6 j" }, s
        cout<<"该网卡上的IP数量:"<<++IPnumPerNetCard<<endl;* K/ h+ q* p8 T
        cout<<"IP 地址:"<<pIpAddrString->IpAddress.String<<endl;$ S% B7 A* E, ], [/ C+ A
        cout<<"子网地址:"<<pIpAddrString->IpMask.String<<endl;
$ e7 `7 i. F! v" L- o& r        cout<<"网关地址:"<<pIpAdapterInfo->GatewayList.IpAddress.String<<endl;
, O4 ?! i: h; E; `8 S" [8 N% b. w        pIpAddrString=pIpAddrString->Next;
$ v- c2 _" K" Q: M& x# G4 l      } while (pIpAddrString);
& g+ v2 o: X7 h' z      pIpAdapterInfo = pIpAdapterInfo->Next;
/ Y7 t. G8 e; H5 F' P. k8 M      cout<<"--------------------------------------------------------------------"<<endl;
- A. J5 M9 H( ^" L: b  }
- i6 U, F( _4 u8 y8 U   6 M' ~7 S/ L2 i
  }1 H/ n  D' J' a4 f' L. B8 Z* N
  //释放内存空间
) S  N: e$ l1 T5 x! [* r# V  if (pIpAdapterInfo)
5 A4 k" t. _, z' V  D- _' e; u1 K  {
+ z5 t$ ?, D; x7 R4 ^8 |. A0 J+ S8 s    delete pIpAdapterInfo;
# p' Y( \: J/ m  }
) ?. `( w3 F0 y* |4 @* V; D4 x    b) L. f  |8 i  x  z: ]7 z  U
  return 0;
% \, p# q* V! x: Q3 z; M}3 Q: {% z1 o# y0 N- }: v, l3 R0 l" `
9 d% \7 }+ w. Z' U! B2 i, I* i! t  }+ `
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了