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

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

[复制链接]

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

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

admin 楼主

2017-10-17 21:05:45

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

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

x
#include <WinSock2.h>
, N! H/ ]3 t  {5 W#include <Iphlpapi.h>
0 @; N7 _0 o( e5 ?4 t  R#include <iostream>8 |+ X7 N4 d3 E* P5 n. q
using namespace std;" t5 f9 Q8 @$ x0 ~$ ~
#pragma comment(lib,"Iphlpapi.lib") //需要添加Iphlpapi.lib库- B) I" Q9 ?/ t1 k+ _1 |6 B

1 _& e) i! ^( e4 {4 ~int main(int argc, char* argv[])
0 z, W4 |+ u& h! j, k7 W  |- A! o; h{6 D+ I4 O9 L7 W+ ]" z% p6 p8 h
  //PIP_ADAPTER_INFO结构体指针存储本机网卡信息
* k7 w8 j: K  m- Y% L# x  PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO();
2 q$ h/ k1 O' |$ F9 B- r. j$ o  L  //得到结构体大小,用于GetAdaptersInfo参数. x- J5 F, I* U  D( z4 |
  unsigned long stSize = sizeof(IP_ADAPTER_INFO);" m- ~0 |( p; o5 S) i
  //调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量;其中stSize参数既是一个输入量也是一个输出量. K, V" G* b: i3 W% W& B
  int nRel = GetAdaptersInfo(pIpAdapterInfo,&stSize);
1 l% A, i$ G  x8 D  //记录网卡数量
1 X& ?$ _" l& v6 }) P3 r  int neTCardNum = 0;* a8 U& X# }% S
  //记录每张网卡上的IP地址数量8 Q$ d7 |" B0 P4 r! u* j. i
  int IPnumPerNetCard = 0;
+ I- J( |0 i1 t7 j  if (ERROR_BUFFER_OVERFLOW == nRel)
! M# h$ {. d7 M% v' G4 G  {6 T# B7 _# r( p$ y2 y
    //如果函数返回的是ERROR_BUFFER_OVERFLOW
, R  w) |7 [+ v% V    //则说明GetAdaptersInfo参数传递的内存空间不够,同时其传出stSize,表示需要的空间大小1 ]' p9 z4 B* ^' A: f
    //这也是说明为什么stSize既是一个输入量也是一个输出量
4 G7 ~; v6 L" i    //释放原来的内存空间4 R3 l& x/ v" ^& h: X. X
    delete pIpAdapterInfo;
1 a! r/ e* m, O  k% y    //重新申请内存空间用来存储所有网卡信息
/ m6 t% c  [& ~3 ~7 m    pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize];1 F$ j/ C3 L( J% E
    //再次调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量
! U, `" b6 e: y" v    nRel=GetAdaptersInfo(pIpAdapterInfo,&stSize);  6 A* r7 p# n& K( r
  }1 |' f: M0 U2 u/ v
  if (ERROR_SUCCESS == nRel)
. o4 d& k4 Q8 g( [  {( e  {% d( Y5 L. V. @6 B
    //输出网卡信息
4 M$ ~& f- a: [% Q( O( Y     //可能有多网卡,因此通过循环去判断
" [# l) g# w9 ?/ N  while (pIpAdapterInfo)
9 Q) u& B9 L: R8 s8 N% d. a. X/ t  {
/ g$ T7 P0 ?7 M0 e    cout<<"网卡数量:"<<++netCardNum<<endl;" _' b' q5 N) f+ v/ \  k
    cout<<"网卡名称:"<<pIpAdapterInfo->AdapterName<<endl;
; p: w; u! q! Y; E) L3 x, W4 v, l    cout<<"网卡描述:"<<pIpAdapterInfo->Description<<endl;
5 U- t3 {' l* A0 L+ e* u/ \/ K/ y    switch(pIpAdapterInfo->Type)
" c* b) Z6 r( H; d  O( P0 I    {
  Z5 P* b; x4 N" T6 p+ ?" ~    case MIB_IF_TYPE_OTHER:1 b/ T8 D9 O4 `$ B2 J' v
      cout<<"网卡类型:"<<"OTHER"<<endl;
/ Z& b% g0 [" f* u8 F$ Y      break;. @- u9 D0 a: Y
    case MIB_IF_TYPE_ETHERNET:+ D9 w4 e/ K8 R
      cout<<"网卡类型:"<<"ETHERNET"<<endl;
3 P5 l+ w; x8 I# Q8 g0 X      break;1 G0 S% x" e& G$ w3 s
    case MIB_IF_TYPE_TOKENRING:; I5 o4 K* W% e) l# J) v( {
      cout<<"网卡类型:"<<"TOKENRING"<<endl;) T7 @; n9 Z3 f  q
      break;  O1 a- N, @! A) [3 W# Y
    case MIB_IF_TYPE_FDDI:/ ]) ?; Y6 }, P; }1 ^3 w
      cout<<"网卡类型:"<<"FDDI"<<endl;
2 s6 J, W3 P, _6 N6 B- Z      break;
$ y1 a! s1 l7 w! ~; B    case MIB_IF_TYPE_PPP:
6 j7 ~. R+ |/ H: r; R/ x/ Z) G# F      printf("PP\n");
6 m8 s# O- @3 T- f9 D- G      cout<<"网卡类型:"<<"PPP"<<endl;
% z- k( p8 m3 N; _* o" X9 g      break;- a% l+ u( w; q" Q
    case MIB_IF_TYPE_LOOPBACK:3 r- v$ \. f5 P% Q, A4 p
      cout<<"网卡类型:"<<"LOOPBACK"<<endl;9 z) W( ^; a  E" P: C! X
      break;
! h2 H. L% g" A* q: V    case MIB_IF_TYPE_SLIP:
* ]! B: h; D) @, k      cout<<"网卡类型:"<<"SLIP"<<endl;
1 Q5 S5 L' q9 r8 X; X      break;
) r4 [; i, f7 ^3 Q9 Z" s    default:
7 z5 h1 E8 Z  Q7 l- d2 y0 h0 D& S# A; A) M7 k6 A  n4 }$ P1 e7 Z
      break;4 m# E  O. X. F) [( d+ z/ b) J0 m
    }
' o  z2 {( ^/ x7 K# C6 n, _  p    cout<<"网卡MAC地址:";
2 ]2 o- S. t8 D& S8 y3 u( u3 p    for (DWORD i = 0; i < pIpAdapterInfo->AddressLength; i++)
# h7 C1 C/ P! R( ]$ y' \( S6 m4 c      if (i < pIpAdapterInfo->AddressLength-1)
* D- d6 P& ^9 _+ R1 p      {
# Q: N. ^- M7 D        printf("%02X-", pIpAdapterInfo->Address);. |  ?. |0 e: U. a
      }& V$ f2 K5 a/ I0 I/ w6 y
      else
/ t# t& L* }" i. e7 g! m      {) {1 F0 K( o& A: u! ^
        printf("%02X\n", pIpAdapterInfo->Address);
5 ]! o. ^! c0 v6 e% J0 ~: E      }
4 ~/ q- p6 t/ f5 J  Z      cout<<"网卡IP地址如下:"<<endl;6 _. j/ j0 h3 T0 t! h2 w* p; p
      //可能网卡有多IP,因此通过循环去判断( L  K9 R7 F1 I9 r+ A. T4 a
      IP_ADDR_STRING *pIpAddrString =&(pIpAdapterInfo->IpAddressList);
; _  r& Z1 `8 p' K) [- T      do) Y7 @7 \0 R, ~7 f; o
      {
9 f- x- N: l4 ?0 I2 M9 _        cout<<"该网卡上的IP数量:"<<++IPnumPerNetCard<<endl;
& `6 Q! }$ \# l* _7 v; L, ^. m9 [        cout<<"IP 地址:"<<pIpAddrString->IpAddress.String<<endl;
% t) ?  k$ d) {& Z  _        cout<<"子网地址:"<<pIpAddrString->IpMask.String<<endl;
' {/ i, X7 L- [% Y- f6 r        cout<<"网关地址:"<<pIpAdapterInfo->GatewayList.IpAddress.String<<endl;- z  L1 b  s; b1 h( h2 |
        pIpAddrString=pIpAddrString->Next;
. o; Y# d0 {5 ~8 z8 |! b      } while (pIpAddrString);) C/ m7 O7 Z( t; `8 J0 }; i
      pIpAdapterInfo = pIpAdapterInfo->Next;8 E0 R# E% y; x  C3 {' z" q9 J
      cout<<"--------------------------------------------------------------------"<<endl;
4 c+ y  q9 f- n/ {+ J/ B0 P4 A9 O1 h  }
2 F& k7 Q; {( x   , O1 u, D& e& i6 C5 H- h0 M
  }
# B# M* L4 r. F, q& u, M( t  //释放内存空间
* _: A- s9 T) b  R. p; o  if (pIpAdapterInfo)
' G  w' o5 j0 g8 `" e  {
7 E8 J  Y) t; h' S! O' v    delete pIpAdapterInfo;
0 B& I3 `! d) p2 w/ A% T  }
% e$ L$ f, i; G1 v% R  ; r/ k; e4 X8 A6 C& j) L
  return 0;
/ O# v# ?: t: u, `( h}: U+ N, Q4 d+ ?3 ]( B

* N' F+ v$ [1 C
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了