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

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

[复制链接]

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

2470

主题

1275

回帖

8万

积分

管理员

PLM之家站长

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

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

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

x
#include <WinSock2.h>
* X7 U$ S; N) E4 D, g#include <Iphlpapi.h>
& K* S  v* w( u#include <iostream>
) Y+ b2 P8 W( Iusing namespace std;1 W8 f0 P% S/ f
#pragma comment(lib,"Iphlpapi.lib") //需要添加Iphlpapi.lib库+ X/ f6 \( m+ r; G

6 E9 z: b  J8 P  ?int main(int argc, char* argv[])0 s: Q" s* h8 n  l1 J
{! r3 ?/ u- k, ?$ C" P. n: ?3 L( q
  //PIP_ADAPTER_INFO结构体指针存储本机网卡信息" g% u1 I$ `. J) Y) X2 u! d5 g  c
  PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO();: z- Y4 t3 o+ A* J  N% p0 Z
  //得到结构体大小,用于GetAdaptersInfo参数
; R. Y4 |/ f* v" }" M8 E* @* y  unsigned long stSize = sizeof(IP_ADAPTER_INFO);- O' l( I7 p$ c0 ]7 g: X
  //调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量;其中stSize参数既是一个输入量也是一个输出量5 B7 F+ Q5 ]' Y8 x1 r
  int nRel = GetAdaptersInfo(pIpAdapterInfo,&stSize);
$ w& Q  t4 z. u. T  //记录网卡数量
, J& r1 }, Q5 }7 X) L3 W/ Y  int neTCardNum = 0;
" t% {) l; y' }! V* {# h' o  f  //记录每张网卡上的IP地址数量0 {" a: O' v3 k  s2 Z$ ?
  int IPnumPerNetCard = 0;) d& ?/ A2 k+ }& h
  if (ERROR_BUFFER_OVERFLOW == nRel)
6 H( C) s# W2 {3 k, ~( i; H  {
( F4 Z' O, i. z% i  l% A% A    //如果函数返回的是ERROR_BUFFER_OVERFLOW
8 A+ j. h. w5 X" P: a+ N    //则说明GetAdaptersInfo参数传递的内存空间不够,同时其传出stSize,表示需要的空间大小% x, R3 G; v/ v2 T; U; t
    //这也是说明为什么stSize既是一个输入量也是一个输出量
4 Z: T" B2 T9 a- B) I& I    //释放原来的内存空间! g) ~3 Y- A0 N3 Z/ r
    delete pIpAdapterInfo;
1 C% ~. Z, F9 ]# c" G* Z    //重新申请内存空间用来存储所有网卡信息# e7 r2 @' x3 N7 C4 G
    pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize];# G, y# y1 @$ B
    //再次调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量6 K. T' Z# s# A+ B" ?
    nRel=GetAdaptersInfo(pIpAdapterInfo,&stSize);  
/ U2 W. R3 ]0 j) B6 Q0 y  }# p  m" _! Q4 G5 p( S& j" J
  if (ERROR_SUCCESS == nRel)
6 c8 E+ ~8 E# r. v1 N) A  {
0 P- a, {- W0 T" h. V+ K    //输出网卡信息1 r! b3 C6 M8 C0 D
     //可能有多网卡,因此通过循环去判断* S& l) T. C! W& T
  while (pIpAdapterInfo)$ |8 u$ z- c  x& H' G" \1 @
  {
% Z; U1 s0 _: {# `6 Y/ V- h    cout<<"网卡数量:"<<++netCardNum<<endl;
+ S! [( Y# D0 T: X, m" Z* P    cout<<"网卡名称:"<<pIpAdapterInfo->AdapterName<<endl;
! A* W0 j9 A" Z    cout<<"网卡描述:"<<pIpAdapterInfo->Description<<endl;
" u  l. c$ H' x% T9 l    switch(pIpAdapterInfo->Type)
. X) s5 ]- |/ x    {0 Y# d& z$ Y& ^  q
    case MIB_IF_TYPE_OTHER:& K* e, m7 U  S" W! [
      cout<<"网卡类型:"<<"OTHER"<<endl;  e4 `2 E  `4 Y. g
      break;
3 p8 O4 S+ s; m6 H  b6 P; k/ c    case MIB_IF_TYPE_ETHERNET:7 c5 |0 c2 D& f) b9 L0 k- w
      cout<<"网卡类型:"<<"ETHERNET"<<endl;
, j9 y6 ~' P6 e. u( f" u# D      break;
. `" c" Y9 l- t& ~- y# f    case MIB_IF_TYPE_TOKENRING:9 g8 L( ?( k9 p* i5 h1 J+ [
      cout<<"网卡类型:"<<"TOKENRING"<<endl;
" D" o" x5 c% Q0 i& I      break;+ s* m- V2 z1 o5 h! W4 g3 L
    case MIB_IF_TYPE_FDDI:
; @2 ], B! i* Z, c2 D" ~      cout<<"网卡类型:"<<"FDDI"<<endl;6 ~* E5 S( S$ M9 O. K3 S! s
      break;3 ]& c$ {; n0 P. n
    case MIB_IF_TYPE_PPP:
0 ^. z2 T8 g4 E5 d" _. J# _6 S      printf("PP\n");; }% G, t+ Q, |- q$ R7 x# L
      cout<<"网卡类型:"<<"PPP"<<endl;
$ _6 r9 Q6 H! k      break;: W9 b. v- L8 z& I& ^
    case MIB_IF_TYPE_LOOPBACK:3 c% D7 d( V* J$ G% K: u% }
      cout<<"网卡类型:"<<"LOOPBACK"<<endl;
% }8 F0 [6 y. Y8 Q& [1 T+ o      break;
7 p/ ?% Y8 `- C: V* o" R! t# F" y6 p    case MIB_IF_TYPE_SLIP:+ [7 e/ e8 `& \( }1 i' ]! o
      cout<<"网卡类型:"<<"SLIP"<<endl;
$ w% _( m% r% y2 m0 ~6 Y+ ]/ o      break;: A( m( _' u, u
    default:
, A# ]4 M& Y# r* R5 `" o- s* f0 \$ @$ ?
      break;" w5 B- l/ d9 f- x" A+ ^* z  {
    }
4 J$ C8 D. s8 M% U/ U    cout<<"网卡MAC地址:";
1 h8 B1 Y1 V6 }  q( U% n  x& y    for (DWORD i = 0; i < pIpAdapterInfo->AddressLength; i++)
+ L; e6 ?0 U! C2 }! I      if (i < pIpAdapterInfo->AddressLength-1)
1 X. B$ ]& x, E6 n- ~  U$ U6 u      {
- U  t5 @- |: O4 L' X        printf("%02X-", pIpAdapterInfo->Address);# q6 H9 n+ a/ h3 |0 p) l
      }
- G: Z) }; F) x, |  x. H      else! ]7 B/ d0 ^* Y$ S9 A9 l/ M
      {
0 U& ]; H- }# a' e4 w. X" l; y# ~& \        printf("%02X\n", pIpAdapterInfo->Address);% W( m! V6 b7 {2 _& {
      }# k: _# q/ f; M$ R. D4 n$ _
      cout<<"网卡IP地址如下:"<<endl;+ }: \5 m" P9 w0 V" \
      //可能网卡有多IP,因此通过循环去判断
; U, |- D: E* R# k/ G      IP_ADDR_STRING *pIpAddrString =&(pIpAdapterInfo->IpAddressList);3 {* o- _& S' a. B% P- M
      do5 C! b) E$ F6 M* Q) I
      {
9 {8 Y, O1 K' \% K( V        cout<<"该网卡上的IP数量:"<<++IPnumPerNetCard<<endl;
# s6 j' g3 e+ s5 P1 [        cout<<"IP 地址:"<<pIpAddrString->IpAddress.String<<endl;+ D* d6 ]7 o% f; x- `
        cout<<"子网地址:"<<pIpAddrString->IpMask.String<<endl;
5 S' j. `: b- @% f5 V        cout<<"网关地址:"<<pIpAdapterInfo->GatewayList.IpAddress.String<<endl;/ a! [+ C1 b/ ]0 }) x& U2 ^
        pIpAddrString=pIpAddrString->Next;
: j+ t5 D6 z+ e% w2 @      } while (pIpAddrString);
! c0 t6 P, F+ Z) }) ~      pIpAdapterInfo = pIpAdapterInfo->Next;
, V$ S; w2 ?$ R& m' t& l! |) D+ O/ a      cout<<"--------------------------------------------------------------------"<<endl;
' n. W9 J9 M% R  }
9 p! T- R6 U& \5 V1 ]8 P! _: k+ i   
( N% j/ J! [3 ^  }
7 d( k/ s; {" b! X0 w  //释放内存空间
3 D% R1 e  |' I! D1 c: K/ X  if (pIpAdapterInfo)  {# B1 Z' d$ l: Z. g
  {/ c  p6 h9 C! O# u
    delete pIpAdapterInfo;
' m2 j) q$ w2 u9 k4 ^  }. l2 x3 N4 T- |
  
( O" }& g8 d# h) r3 k2 q  return 0;
' n6 |' E9 O* m; D}
6 t+ @: W8 Q  x: A5 @! g
/ ?) L4 Q' F+ c7 S# B
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了