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

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

[复制链接]

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

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

admin 楼主

2017-10-17 21:05:45

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

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

x
#include <WinSock2.h>
1 l5 ]  v1 `9 F+ s: c% C: `- t3 T8 M#include <Iphlpapi.h>- c3 ]& u! `5 x) A; S/ B5 e
#include <iostream>
* u+ v+ w# `/ x' _using namespace std;
0 c4 S5 j* `! `1 p#pragma comment(lib,"Iphlpapi.lib") //需要添加Iphlpapi.lib库0 W! c# w3 `7 W: l% Y$ k, D& y, ^
& Z+ W, ^$ S8 N4 f9 |9 \
int main(int argc, char* argv[]): |" s& u+ S  \
{
: m) ^, {7 I) U+ u9 U1 p3 Y" O  //PIP_ADAPTER_INFO结构体指针存储本机网卡信息) k- w; X, L+ G; t6 J; o
  PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO();- c5 j3 D2 x3 q/ m8 N7 s
  //得到结构体大小,用于GetAdaptersInfo参数
. i! Y  G$ E* c  unsigned long stSize = sizeof(IP_ADAPTER_INFO);
, `5 z5 H0 @9 _2 G, W) L6 `$ s  //调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量;其中stSize参数既是一个输入量也是一个输出量
0 r- d7 `- X; j0 V0 O3 _' D  int nRel = GetAdaptersInfo(pIpAdapterInfo,&stSize);) s* X% i$ L, N$ U
  //记录网卡数量
5 o3 G6 J5 N4 l6 G  int neTCardNum = 0;$ z2 U  D$ L/ P3 R
  //记录每张网卡上的IP地址数量
9 ^( t% N% q) v5 h% ?( U  int IPnumPerNetCard = 0;
  ?" \& _% p5 Z6 J, ]  K  if (ERROR_BUFFER_OVERFLOW == nRel)! O! x# y; [- a5 u% ]
  {1 w8 S& a0 j% U6 u  J2 t6 t" ]
    //如果函数返回的是ERROR_BUFFER_OVERFLOW& v% X0 w  E6 c+ C  L4 @) w
    //则说明GetAdaptersInfo参数传递的内存空间不够,同时其传出stSize,表示需要的空间大小
( V3 m5 g- \7 o0 D7 n8 a% s/ R    //这也是说明为什么stSize既是一个输入量也是一个输出量
+ n( @0 i6 @7 M( Y; K    //释放原来的内存空间
$ U1 w& E1 u. A    delete pIpAdapterInfo;6 H3 B" P( ?! X6 w, X4 O  V
    //重新申请内存空间用来存储所有网卡信息- a, K! ~" G/ R/ \: a
    pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize];
3 |4 L/ [1 \, Z: k, o+ L% g* m    //再次调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量
* h  S4 q, r% P2 n! I. s5 j) z    nRel=GetAdaptersInfo(pIpAdapterInfo,&stSize);  
2 @% @6 q- m2 q8 ^( T( a  }0 l/ h' X7 d4 l( X( B7 r
  if (ERROR_SUCCESS == nRel)0 o3 g+ D+ f+ n
  {
- N. Y5 i% W9 x% }    //输出网卡信息/ b( m, m. O' V; _
     //可能有多网卡,因此通过循环去判断
% [% C) @4 D% V$ V6 q  while (pIpAdapterInfo)
& b$ i* s4 V. n- z  {( W% B( C! b6 T4 K' o  |7 K+ |
    cout<<"网卡数量:"<<++netCardNum<<endl;! f. D) O5 l! {1 y! O- ]" ?
    cout<<"网卡名称:"<<pIpAdapterInfo->AdapterName<<endl;
, e1 G# N0 d- X6 O/ D, s3 f6 B    cout<<"网卡描述:"<<pIpAdapterInfo->Description<<endl;4 B) P. M/ K& h$ \! R1 a; E
    switch(pIpAdapterInfo->Type)5 k$ Z2 C' I5 h/ U( y
    {+ z% J3 C7 |8 R+ O3 q
    case MIB_IF_TYPE_OTHER:! p) J7 E+ i! q4 o4 d$ r
      cout<<"网卡类型:"<<"OTHER"<<endl;
  H, V% o! r8 l+ Q9 [      break;( y, S* g5 w  L7 ?
    case MIB_IF_TYPE_ETHERNET:* s. B5 n- J2 h, s) }; g, n7 E
      cout<<"网卡类型:"<<"ETHERNET"<<endl;6 V5 N# T2 P- Y3 _
      break;6 J- v- N# |  @: K) G/ E2 Y9 I
    case MIB_IF_TYPE_TOKENRING:
* Q& n7 v0 n8 A0 ?# N      cout<<"网卡类型:"<<"TOKENRING"<<endl;4 {9 [; a* b' _4 b0 \% |
      break;
- A- y& ?( q3 r, V. X! a/ g    case MIB_IF_TYPE_FDDI:
7 V& K8 _7 O2 l& b. s& y. |      cout<<"网卡类型:"<<"FDDI"<<endl;
! r5 r! l9 S; w# C      break;! \7 ]5 o3 `* q- Z! q
    case MIB_IF_TYPE_PPP:
0 ~( C6 y1 {) \9 S/ [4 P& ~      printf("PP\n");/ v6 e0 b$ e. W2 o1 {9 n
      cout<<"网卡类型:"<<"PPP"<<endl;
6 y! z7 U1 |' R4 W+ t      break;
* X6 K1 K1 M/ r0 V+ u    case MIB_IF_TYPE_LOOPBACK:" E3 I" _( |0 S0 H
      cout<<"网卡类型:"<<"LOOPBACK"<<endl;
3 n: w0 j6 @: V1 M9 }" y# D      break;
5 P5 I! T' c( ?* K, U    case MIB_IF_TYPE_SLIP:9 W( A3 W# G. U9 J- i6 y
      cout<<"网卡类型:"<<"SLIP"<<endl;
4 }" ^* \2 I  U, k5 Y      break;
7 y+ @. n9 H' e    default:$ w, j' N0 H0 p# k6 }

- ^. Y7 M  C4 o6 l9 Q2 T      break;5 s6 R# ^+ r2 J3 n
    }
9 d  f% z/ o% r# y3 |2 |' Z    cout<<"网卡MAC地址:";( p7 n5 D8 F! Z0 O
    for (DWORD i = 0; i < pIpAdapterInfo->AddressLength; i++)
% j. e( r: o  n1 G$ Q      if (i < pIpAdapterInfo->AddressLength-1)
- [/ H7 B; d0 Z0 H' g1 w# t: m- k8 H      {* l( M) ^# e7 @' q
        printf("%02X-", pIpAdapterInfo->Address);- G8 a  T* D/ T4 }4 m5 ^
      }1 h, S$ [* c  t. y
      else. b5 @: X  O- l
      {
% `: O3 D2 g2 x% d) d        printf("%02X\n", pIpAdapterInfo->Address);
8 z" Z' z6 n, H$ N      }
3 [! s/ Y/ }- |/ X& |- L      cout<<"网卡IP地址如下:"<<endl;
' k- @8 S/ V4 V      //可能网卡有多IP,因此通过循环去判断. \2 m; b2 T' O) L8 b1 R6 q
      IP_ADDR_STRING *pIpAddrString =&(pIpAdapterInfo->IpAddressList);5 c1 t0 Y4 @4 c
      do
8 a* a5 T' X6 d) I$ F, Y( n! h6 v      {
0 E" y" b, m& }% c+ }3 z. S        cout<<"该网卡上的IP数量:"<<++IPnumPerNetCard<<endl;; r0 N9 x$ H+ u% @7 Y, v
        cout<<"IP 地址:"<<pIpAddrString->IpAddress.String<<endl;
0 ]; P. B8 S3 a$ h' Y. Q( E6 Y        cout<<"子网地址:"<<pIpAddrString->IpMask.String<<endl;! c( d! O2 V. p1 p( I4 }
        cout<<"网关地址:"<<pIpAdapterInfo->GatewayList.IpAddress.String<<endl;) j( f4 n% m. F) Z5 j- M/ L/ |
        pIpAddrString=pIpAddrString->Next;
: U$ T% L; ?5 N  h* K( u( `, ]: ]      } while (pIpAddrString);
1 F' d/ H1 D! R; k! v; w! c) G6 A) g      pIpAdapterInfo = pIpAdapterInfo->Next;
4 _% l4 Q) A6 U. s5 f$ w; x! Y      cout<<"--------------------------------------------------------------------"<<endl;
! O' _0 \; X5 T0 W, C  }
- C9 T& x3 L% H) T   
, P) f+ X3 [$ ^. M0 @  }% l0 g2 b) w$ D* [
  //释放内存空间. }& s0 J) d# Q/ P: d  H# h5 r
  if (pIpAdapterInfo)$ X, z7 |0 }: v( T$ v# A/ r
  {
3 C5 P- i6 l7 q7 p# b6 X( w' U8 _$ {    delete pIpAdapterInfo;0 q9 F& z" {  M$ S( ]
  }, i1 t" K1 M3 j+ q- {/ D% {
  2 L3 k8 I6 `5 B# t8 t
  return 0;
' m/ F. d- V0 i: S) G: Y  I0 F}
5 X2 ~, M$ _& \3 u: j2 G7 y2 x, q5 k$ R) M
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了