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

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

[复制链接]

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

2470

主题

1275

回帖

8万

积分

管理员

PLM之家站长

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

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

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

x
#include <WinSock2.h>
6 F- f1 y. ^8 V  ?#include <Iphlpapi.h>
9 B$ _: F6 M* T5 ]1 B9 V& l3 V6 P, q#include <iostream>! d3 \$ e9 D7 c! E( A" a+ w
using namespace std;5 b. d- l) U2 D5 a" p
#pragma comment(lib,"Iphlpapi.lib") //需要添加Iphlpapi.lib库/ |7 X3 i; L) G3 Q. }
* Y! s& y( r+ J2 a9 i/ v, M( [
int main(int argc, char* argv[])8 T" c4 U9 m9 L8 N$ b
{4 _4 A/ x, L; O5 Y, b# N* n0 Q
  //PIP_ADAPTER_INFO结构体指针存储本机网卡信息
9 d, D' D% Y) G( Z1 P5 D  PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO();
* m  }/ b0 s( k$ ?6 a2 ]  //得到结构体大小,用于GetAdaptersInfo参数
6 x2 L, ^/ H# T6 S+ u  unsigned long stSize = sizeof(IP_ADAPTER_INFO);
2 h8 `" t8 _" @" E2 K/ L  //调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量;其中stSize参数既是一个输入量也是一个输出量
3 Z3 [1 ~1 k1 r1 g  int nRel = GetAdaptersInfo(pIpAdapterInfo,&stSize);
8 c% H5 z  @& m  N$ d1 j  //记录网卡数量
( g* j4 o5 |. K6 A# n  int neTCardNum = 0;
: |2 x7 z7 M! \  //记录每张网卡上的IP地址数量
5 O7 ~; _3 @; `$ d  int IPnumPerNetCard = 0;
' U' Q7 ^3 n4 V# `5 T% p  s! f% Q  if (ERROR_BUFFER_OVERFLOW == nRel)
6 C; P1 Z- f7 k$ h, h) p& W8 W  {. O0 F3 ~! V$ @4 ]4 m6 I- ~( k- c
    //如果函数返回的是ERROR_BUFFER_OVERFLOW$ P1 D/ n* a/ F, U. D0 [
    //则说明GetAdaptersInfo参数传递的内存空间不够,同时其传出stSize,表示需要的空间大小, A4 Z" c6 V+ t- ?. f
    //这也是说明为什么stSize既是一个输入量也是一个输出量5 Y6 ~$ `! S9 _3 u* `' q
    //释放原来的内存空间, B+ ^( I: {6 r6 k1 P. n
    delete pIpAdapterInfo;
, ]3 _4 ]  ]0 @1 ?: U( O    //重新申请内存空间用来存储所有网卡信息
/ p: A7 `; u: ^! Z    pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize];
5 n- `7 Q# e; m7 p    //再次调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量8 F. h; \, y; [* t$ ^9 y# X
    nRel=GetAdaptersInfo(pIpAdapterInfo,&stSize);  1 q8 u  u3 p: r+ ?1 w
  }
% Z) ^8 A* P9 [5 O+ Z4 R  if (ERROR_SUCCESS == nRel)! O2 O, C- R% I2 B( h. y
  {" F3 |. d; C. V# x7 y# x" V0 n
    //输出网卡信息7 B. \+ W5 |- m: T$ g. N
     //可能有多网卡,因此通过循环去判断
/ K  |  r/ ?6 \( k( @7 Y( f  while (pIpAdapterInfo)
6 R! h0 Z4 Z& x6 }& _: i  {2 D5 v8 I. z4 [6 ~3 a* u) k
    cout<<"网卡数量:"<<++netCardNum<<endl;
5 _7 m8 D- p$ N/ _+ G& x, ]# ?    cout<<"网卡名称:"<<pIpAdapterInfo->AdapterName<<endl;7 I! U& }2 ^) H! v/ ^% l1 ?
    cout<<"网卡描述:"<<pIpAdapterInfo->Description<<endl;
4 K4 v  z+ W) c% |; V6 b    switch(pIpAdapterInfo->Type)
* t' v4 a/ ?4 J2 B. d5 c5 r    {+ e' ?' }  _* p
    case MIB_IF_TYPE_OTHER:7 a: ]+ j1 ^7 g) u: ^4 V
      cout<<"网卡类型:"<<"OTHER"<<endl;
) a" |8 @) g# _* J4 i1 n+ ^      break;
3 H+ L+ j! i" p$ j  _( b, g    case MIB_IF_TYPE_ETHERNET:
+ y& D) Q/ O) ?/ ?      cout<<"网卡类型:"<<"ETHERNET"<<endl;9 z2 k* I5 Y6 m: [
      break;8 H  t) V' l2 i' H4 p. T; v, K. _( U& D
    case MIB_IF_TYPE_TOKENRING:
/ Z! p, H. {9 ?1 k7 o$ {      cout<<"网卡类型:"<<"TOKENRING"<<endl;
+ V' X# p3 B! @+ t8 q! P+ C/ Y1 x2 M; J      break;! d# ?7 r* n1 T2 D, p4 M! J% Y
    case MIB_IF_TYPE_FDDI:
0 }( J, A. _) n) c      cout<<"网卡类型:"<<"FDDI"<<endl;: j7 @3 l* ~5 h2 s9 P3 L
      break;2 |) ~: a* ~  E, b8 a. l- X
    case MIB_IF_TYPE_PPP:* t: H3 X% N8 H# P, o
      printf("PP\n");( g( H0 n) z( y2 I% \- w
      cout<<"网卡类型:"<<"PPP"<<endl;
, A1 F( a+ Q. m5 \      break;
! Y* p4 t+ s9 Q, r; s9 V    case MIB_IF_TYPE_LOOPBACK:
+ g* J6 O% f: ~0 M0 t      cout<<"网卡类型:"<<"LOOPBACK"<<endl;" P2 c! l/ L. r
      break;8 d" [3 E& n4 k" Y$ |2 K# ~6 Q+ Z
    case MIB_IF_TYPE_SLIP:, c; r! @7 B, A4 |, X
      cout<<"网卡类型:"<<"SLIP"<<endl;
7 ?% m& ]" b$ d6 h      break;
* i* B& L) k# W$ K" U    default:
! M6 V2 y5 Z. l; O7 {; M' L) q) u1 @$ F9 b$ d% H9 b# S5 Z
      break;" Z: n, H- w7 L3 z. i  d6 T( c, x7 N
    }
8 Y( I! H+ |8 ]4 t! l    cout<<"网卡MAC地址:";
  ~+ l& ]: G2 k5 _# P    for (DWORD i = 0; i < pIpAdapterInfo->AddressLength; i++)* C# `& b3 h: G) C8 K
      if (i < pIpAdapterInfo->AddressLength-1)5 v+ u( f2 z& b: d5 u( V4 ?
      {2 i" |1 ?) ?9 p1 I6 l% U$ d
        printf("%02X-", pIpAdapterInfo->Address);
5 Y9 r; [$ L# q. c' q2 s' E; H. G      }
# q% O6 I( m, E6 ^4 h& {      else
4 b9 \! a6 a* p) e+ O- H' p      {
# [' k! {/ y5 B: a% w        printf("%02X\n", pIpAdapterInfo->Address);( W0 B1 O3 Y4 g' T
      }
; `' i0 u; D; |      cout<<"网卡IP地址如下:"<<endl;
$ g! g( O/ e( J- S  h# z/ M' T      //可能网卡有多IP,因此通过循环去判断
: w$ ~5 e8 O% K  s) f      IP_ADDR_STRING *pIpAddrString =&(pIpAdapterInfo->IpAddressList);
. Z! X" O8 a* v$ m$ I% Q9 I      do; ^# a( ?& P) }, U
      {8 `; c0 G9 |- E4 l6 ]
        cout<<"该网卡上的IP数量:"<<++IPnumPerNetCard<<endl;
; b9 q+ t+ D0 x8 Q        cout<<"IP 地址:"<<pIpAddrString->IpAddress.String<<endl;  R2 m7 Z" f  J1 `1 m
        cout<<"子网地址:"<<pIpAddrString->IpMask.String<<endl;
, D/ h( a- ]4 C3 Q        cout<<"网关地址:"<<pIpAdapterInfo->GatewayList.IpAddress.String<<endl;
* M7 u7 o. t6 d! E- M" F        pIpAddrString=pIpAddrString->Next;( @: S( r2 w. V9 L" E' @
      } while (pIpAddrString);
; y$ A7 u6 j3 J' i2 D4 I      pIpAdapterInfo = pIpAdapterInfo->Next;
6 }1 s8 G( ?& |, L7 Y      cout<<"--------------------------------------------------------------------"<<endl;  E6 c8 ~- J( T0 C* ]" V6 U9 C3 H
  }9 b7 S) m4 w! H3 f* f% K( ^
   8 W0 \/ G& r1 {/ y3 c5 r  D
  }1 K2 v0 O1 Y+ J& T4 p, J' q
  //释放内存空间9 ]* E1 a3 y, s
  if (pIpAdapterInfo); X# |' X* x1 v, D9 B
  {3 Q( I# l' W3 F8 L) V- V* X6 y
    delete pIpAdapterInfo;
2 S- Y. j/ B' g8 u; }% q" e: l  }
, U0 _5 Y9 |1 A; L, O4 q  - A! `5 W2 }2 E  T* z
  return 0;
5 _$ t: \8 j/ M/ K5 ?}
# ~0 X& k) G" k
$ o) `3 s& l- f( ]1 Z" [
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了