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

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

[复制链接]

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

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

admin 楼主

2017-10-17 21:05:45

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

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

x
#include <WinSock2.h>
: U2 g* p' \& s8 w# g#include <Iphlpapi.h>
( c# f9 o" L5 P! ^& a4 z; @) {#include <iostream># _4 m5 X; r  K
using namespace std;. ]8 f) Y) m- J: v' y! O
#pragma comment(lib,"Iphlpapi.lib") //需要添加Iphlpapi.lib库
3 p( k' A+ E, F# c8 g+ P7 h. q4 u  Q
9 s* `9 w" O; l# A+ d# tint main(int argc, char* argv[]): `: L& x9 G1 q' E- e+ E1 E
{9 A% [! X) ~+ |8 t6 F
  //PIP_ADAPTER_INFO结构体指针存储本机网卡信息' w4 j, p) g% s
  PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO();
3 C, @) [0 n( i2 A, g7 l7 l  //得到结构体大小,用于GetAdaptersInfo参数
9 ]8 g+ k- k& }  unsigned long stSize = sizeof(IP_ADAPTER_INFO);
. i/ k  i3 {0 Y+ |' X5 d  //调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量;其中stSize参数既是一个输入量也是一个输出量" w( F- B. ]8 W1 p* e8 R
  int nRel = GetAdaptersInfo(pIpAdapterInfo,&stSize);
+ X% M( Q' B+ h- m3 ?, a0 p  //记录网卡数量
3 A" K0 l- G6 f; j: d  int neTCardNum = 0;% w. ^2 j0 J4 A# ~- f3 K
  //记录每张网卡上的IP地址数量
; T; o4 u; A, \" G  int IPnumPerNetCard = 0;/ I+ S1 O% [4 N
  if (ERROR_BUFFER_OVERFLOW == nRel)
" f9 _7 [( X. n: M  {
  o' K) I9 ^5 m/ S- ]    //如果函数返回的是ERROR_BUFFER_OVERFLOW$ a6 W. @" K' z0 v( {* h. |
    //则说明GetAdaptersInfo参数传递的内存空间不够,同时其传出stSize,表示需要的空间大小4 Z: `' L. J# I! ]+ ^* J& T
    //这也是说明为什么stSize既是一个输入量也是一个输出量
5 l. r8 U% V7 M1 _2 B7 N2 s    //释放原来的内存空间
4 y3 h" ^" G3 i' b6 [, r: {3 o    delete pIpAdapterInfo;
# W+ E5 p' ]. p8 M0 X$ K" r7 D    //重新申请内存空间用来存储所有网卡信息+ z( s2 b  b( Z
    pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize];
" [  ]% S  s3 [. k+ t% n% o& \    //再次调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量- N7 c5 @- I2 X+ U
    nRel=GetAdaptersInfo(pIpAdapterInfo,&stSize);  3 e8 n5 l+ E) u7 I6 T2 \- x
  }
1 }" n7 H9 r( o/ b+ Z7 s% p% g2 d  m  if (ERROR_SUCCESS == nRel)" z1 m7 s" ~6 M1 ~* t" c
  {
7 u4 |# K9 U  o0 e* D, ~8 H' y    //输出网卡信息
6 U9 k8 `- U$ f: v# ^+ J! z     //可能有多网卡,因此通过循环去判断1 i; p! Q& W5 T8 @$ @7 x3 K
  while (pIpAdapterInfo)
4 \. ]# x" q7 T# x- Y4 p( R9 d  {
/ A  ], Q3 r$ s1 F' q+ r; e    cout<<"网卡数量:"<<++netCardNum<<endl;; l1 t: Z" u1 H8 ^+ y6 r# t1 U; g
    cout<<"网卡名称:"<<pIpAdapterInfo->AdapterName<<endl;
6 X! U' E# F* [+ @    cout<<"网卡描述:"<<pIpAdapterInfo->Description<<endl;" O" n% D  ~% \) x& \/ L! X
    switch(pIpAdapterInfo->Type)% a' T: F7 o+ \0 F2 B& }
    {
( B  p/ d2 ^- K& O" K+ f: Z    case MIB_IF_TYPE_OTHER:1 k  _* _% t( b. E9 f
      cout<<"网卡类型:"<<"OTHER"<<endl;3 Y1 @3 ?( U; R" m- T
      break;
: g  T7 @/ ?" K  ^1 ?4 c& R    case MIB_IF_TYPE_ETHERNET:3 j- @0 b$ d3 |' [2 q5 U8 O
      cout<<"网卡类型:"<<"ETHERNET"<<endl;9 o1 n# Z" @( w- I
      break;2 m* f7 ]# Q% [3 C
    case MIB_IF_TYPE_TOKENRING:
! X! T% G$ N2 g4 L  \      cout<<"网卡类型:"<<"TOKENRING"<<endl;+ i' o6 c( t: A# @, B
      break;
+ Y7 J# S2 @$ F' h; e* ]! p9 ]    case MIB_IF_TYPE_FDDI:
& {( D' I( W) }( a5 j. `$ S      cout<<"网卡类型:"<<"FDDI"<<endl;
( @9 _8 R5 V) Y      break;
9 [  T+ l0 _5 L5 V( |0 E; j    case MIB_IF_TYPE_PPP:
0 h: Z8 M% Z5 b! R      printf("PP\n");( ~1 e, I! K3 F$ i. @4 c
      cout<<"网卡类型:"<<"PPP"<<endl;
2 R6 S$ e0 e/ {. n; u" `7 ~      break;7 N0 {2 T0 m6 E0 m5 p4 q& k
    case MIB_IF_TYPE_LOOPBACK:
- w3 u9 K; r6 P2 {: G+ ?0 Z. h/ T      cout<<"网卡类型:"<<"LOOPBACK"<<endl;
  q& T8 Z0 a0 v1 S; s      break;
2 w' b. E4 Z. J1 S0 o    case MIB_IF_TYPE_SLIP:* \) h; Q% B2 ]1 p$ X  z' o, B& ^
      cout<<"网卡类型:"<<"SLIP"<<endl;6 a' A, B4 v- r, h- i
      break;
' l! r3 }3 R1 H' j' l, w$ q) |    default:
9 Z7 ?6 b9 `/ V2 a& c
. U& D) L- m9 h) G" @      break;
6 L  {: C: x. u. Z    }
! _$ r1 E& D  H0 p6 x0 ~3 M    cout<<"网卡MAC地址:";
! [, a. R4 W7 G. O" R+ z  I    for (DWORD i = 0; i < pIpAdapterInfo->AddressLength; i++)
1 I' J$ M0 ]" O( e# k7 a4 M      if (i < pIpAdapterInfo->AddressLength-1). O7 z( b* c6 V# ?" Q/ Q8 H
      {" ^% ^! l' \2 ]& Z4 Z) x
        printf("%02X-", pIpAdapterInfo->Address);% [( P$ I% t; f8 f# {/ D6 v
      }
, |' {3 T1 T* ?2 D% u0 A      else6 X/ U2 L) a. E% Y
      {6 Q0 H( q" w, J9 v
        printf("%02X\n", pIpAdapterInfo->Address);
7 ^" L2 f5 S2 V: d8 h+ F( A      }
- {2 D% y. i9 z; T1 K6 h7 {      cout<<"网卡IP地址如下:"<<endl;  F# e, _$ I8 A6 D" I) S
      //可能网卡有多IP,因此通过循环去判断" L/ e8 o7 ~/ U/ g
      IP_ADDR_STRING *pIpAddrString =&(pIpAdapterInfo->IpAddressList);( O, h6 V- ?% N" A# ?/ d+ V
      do) L- D; L. U/ d8 K/ t; f6 S7 S
      {! {4 e5 f* [8 ?: Q" i- F
        cout<<"该网卡上的IP数量:"<<++IPnumPerNetCard<<endl;9 j: H  G+ [) S7 s  v
        cout<<"IP 地址:"<<pIpAddrString->IpAddress.String<<endl;
9 ~" b+ \' Z+ k, N        cout<<"子网地址:"<<pIpAddrString->IpMask.String<<endl;3 V* ]8 B( Y: [: S: [- W
        cout<<"网关地址:"<<pIpAdapterInfo->GatewayList.IpAddress.String<<endl;1 w, h; F% }' C9 c: h* g7 Y
        pIpAddrString=pIpAddrString->Next;
( |! T1 x2 L: z      } while (pIpAddrString);
7 [1 E0 A# r" U9 w9 k      pIpAdapterInfo = pIpAdapterInfo->Next;3 X& }" j6 V* a/ q: o
      cout<<"--------------------------------------------------------------------"<<endl;- B, h7 c& x5 s3 K4 \$ j
  }
  h6 z2 P9 d: R6 _, x4 i! A3 j: w   
" b2 O3 T2 ^1 X7 i  }% j' m; S' S) L% R
  //释放内存空间# z6 D, Z: _% p& S* k' g6 q
  if (pIpAdapterInfo)& v  B  Z( g2 D3 }
  {
' b7 U& B/ M2 a; `0 U/ S    delete pIpAdapterInfo;
2 ^4 E" }* t1 z0 E; F/ ]( }! N/ D  }: k6 V+ q- w1 [* O- ^$ ^
  
# U: K: R- Y( S. }; V  return 0;% G* \# r1 X8 `
}7 b( j4 ?+ p0 E
! l6 V: \* R' W4 t  Q1 W
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了