PLM之家PLMHome-工业软件与AI结合践行者

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

[复制链接]

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

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

admin 楼主

2017-10-17 21:05:45

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

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

x
#include <WinSock2.h>
$ ^: m, [- [7 c#include <Iphlpapi.h>
4 N5 g- y0 g. h#include <iostream>6 l7 @2 {# x! y
using namespace std;" H) W5 H6 K2 |' k6 g* e
#pragma comment(lib,"Iphlpapi.lib") //需要添加Iphlpapi.lib库
1 l) b" D. l' Y* e& O% _/ ^( i' ~+ H3 Q, g
int main(int argc, char* argv[])/ Q# S3 K1 E# n1 U+ G
{
9 \# J+ s( ], s. n( X; o3 [  //PIP_ADAPTER_INFO结构体指针存储本机网卡信息; q: L: ?+ w1 s- u, V) w& @7 P' q
  PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO();# ]' f7 w; b9 J3 q1 @
  //得到结构体大小,用于GetAdaptersInfo参数
" t. O! a4 D; ?9 h* C8 f  unsigned long stSize = sizeof(IP_ADAPTER_INFO);
5 m8 s! j0 v1 \% R1 i" v  //调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量;其中stSize参数既是一个输入量也是一个输出量& a; P# C; m5 t$ d7 ?
  int nRel = GetAdaptersInfo(pIpAdapterInfo,&stSize);7 U8 d% w. ]2 s& ]& s" F
  //记录网卡数量
+ I& F" P( P( H  int neTCardNum = 0;
* k" ~  P$ H3 w+ q9 t  //记录每张网卡上的IP地址数量3 T9 N' b* z" n8 Z( x' {  W
  int IPnumPerNetCard = 0;
! C' ~! B- X; ?) Z  if (ERROR_BUFFER_OVERFLOW == nRel)
; n/ m% A% ~+ X( A9 ]( N- f  {% V( W) c5 Q" J$ F" ~) d: l
    //如果函数返回的是ERROR_BUFFER_OVERFLOW
* ^& _5 i# o1 X5 C: z9 G    //则说明GetAdaptersInfo参数传递的内存空间不够,同时其传出stSize,表示需要的空间大小7 J) e% A' `! }" V' Y/ M/ o
    //这也是说明为什么stSize既是一个输入量也是一个输出量
) \* `5 G! o' A/ }    //释放原来的内存空间" j4 m3 J: L6 ?( I( u$ H- K- H
    delete pIpAdapterInfo;
& B5 b4 Z) n0 z; G& Y' `" q; ]    //重新申请内存空间用来存储所有网卡信息
2 ~0 a4 a' g9 P2 g6 ]% _    pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize];
. _( f% l7 r0 O- c. T    //再次调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量
7 L1 M6 T% N3 E+ g9 M    nRel=GetAdaptersInfo(pIpAdapterInfo,&stSize);  0 C8 c! j0 p2 v# K7 r/ Z
  }2 B: N9 P. s0 j# m) ^0 U! e9 G
  if (ERROR_SUCCESS == nRel): q( k' C; A( ^7 @
  {
( Y. f+ S3 `) A4 d; I    //输出网卡信息+ q$ W) a! a( h+ x) Z  H7 M( o8 |
     //可能有多网卡,因此通过循环去判断
9 n0 x, r# T. V7 C4 p  while (pIpAdapterInfo)2 ?9 C, _7 ?) ~' ?; @: w! K
  {4 W4 T0 l; O3 K( Q& S6 Q
    cout<<"网卡数量:"<<++netCardNum<<endl;7 B6 x2 Z$ J0 y# x# c
    cout<<"网卡名称:"<<pIpAdapterInfo->AdapterName<<endl;
( M6 I: w# E) O* F$ u* C    cout<<"网卡描述:"<<pIpAdapterInfo->Description<<endl;
. ]0 K, L2 ]- y) ]7 g7 S8 i- o& K    switch(pIpAdapterInfo->Type)
/ U- B, G' J" ]( n    {
. q* \' m# A3 A4 d$ D    case MIB_IF_TYPE_OTHER:2 O8 L% C# [, Z" J7 _" {
      cout<<"网卡类型:"<<"OTHER"<<endl;/ z7 }4 r: g: W1 r. T. G
      break;
6 U3 I' {% V$ s, U    case MIB_IF_TYPE_ETHERNET:
+ H: z1 w. Y1 W      cout<<"网卡类型:"<<"ETHERNET"<<endl;+ J  A* {+ ?5 v$ N6 @
      break;
" e( i. i2 b2 L    case MIB_IF_TYPE_TOKENRING:
: [/ z% K6 H" J      cout<<"网卡类型:"<<"TOKENRING"<<endl;4 l; X& N* V, C. M- A
      break;
2 ~" \4 x, @# [  [    case MIB_IF_TYPE_FDDI:
# X5 t) ]6 m0 N( h: a6 Z. O; h      cout<<"网卡类型:"<<"FDDI"<<endl;0 X  b6 v9 P* ~
      break;# R% ^, z4 q" |) {$ c' A- l: t2 N
    case MIB_IF_TYPE_PPP:- X7 K+ h* J$ B4 b9 ^  g' a' ]+ }
      printf("PP\n");
9 n1 Z- b9 W; x. v9 [2 I; q6 R# w* Z      cout<<"网卡类型:"<<"PPP"<<endl;
# e$ l9 X. X: g! h, t: j      break;
( j% y& n, k' C) T$ d    case MIB_IF_TYPE_LOOPBACK:8 a/ J# g/ u0 c- f2 ]. c& ]( t! B
      cout<<"网卡类型:"<<"LOOPBACK"<<endl;& b( ^1 g- ~: Y9 J; _; v
      break;
: |/ r8 a  i$ s# {    case MIB_IF_TYPE_SLIP:9 O& A, K. e5 K6 }/ R
      cout<<"网卡类型:"<<"SLIP"<<endl;  C" g" I" t& D
      break;& u7 k& g2 K9 X) R6 [7 U% \
    default:
9 \9 s6 u, S. j1 x: g+ v' X( ?5 m1 {5 z  e0 Y5 Y# k
      break;
# c  ~2 `* X! ?2 t    }
! V( b# p, l) T3 B  `% }$ M* y    cout<<"网卡MAC地址:";4 @8 s+ D4 Q, {5 Y$ P. _5 o
    for (DWORD i = 0; i < pIpAdapterInfo->AddressLength; i++)- L- P" E% i$ S3 {7 n: G
      if (i < pIpAdapterInfo->AddressLength-1)
2 [) M; i% C% {3 p% l      {
, d3 P# Y. `# U        printf("%02X-", pIpAdapterInfo->Address);
# J2 W# d4 Y, H' Z' v. `# N& H$ f      }
  i% K; a. x5 g: N7 h; D8 M      else
4 T7 X  ?" H7 l. z+ [; Z      {
# y) U5 ~- }5 W( h        printf("%02X\n", pIpAdapterInfo->Address);4 o5 R* |! P% d/ i
      }. n0 \6 Y6 A# y8 s
      cout<<"网卡IP地址如下:"<<endl;
. \) y5 y) n# s. U* W# b      //可能网卡有多IP,因此通过循环去判断/ `4 X+ t% r. {1 `$ {
      IP_ADDR_STRING *pIpAddrString =&(pIpAdapterInfo->IpAddressList);
! u/ T" _: u8 \) u% S$ j7 [- p      do
  _1 {& ~. I/ b' Q- i3 T      {
5 I# ~6 z( ^6 p        cout<<"该网卡上的IP数量:"<<++IPnumPerNetCard<<endl;
' w. ~1 [5 U" I: l  [        cout<<"IP 地址:"<<pIpAddrString->IpAddress.String<<endl;
$ F1 @! y. G' _        cout<<"子网地址:"<<pIpAddrString->IpMask.String<<endl;3 {. P$ O; E% Y) z. j
        cout<<"网关地址:"<<pIpAdapterInfo->GatewayList.IpAddress.String<<endl;  ^8 K& c: C9 t8 Y
        pIpAddrString=pIpAddrString->Next;
% M' x! @: V& W4 ?! z$ j      } while (pIpAddrString);' b( M$ I, ?0 s! {" }: X
      pIpAdapterInfo = pIpAdapterInfo->Next;5 r& I$ g" z5 I" K3 U; w/ x  @
      cout<<"--------------------------------------------------------------------"<<endl;$ J4 C- |; ^$ G& H
  }$ l/ |5 O  v7 X& l, u: d, G4 }
   * `8 i5 [3 o# K
  }
$ J$ F( M; V2 Y% [8 h  //释放内存空间
+ n+ h$ g# f2 d7 e8 |2 K  if (pIpAdapterInfo)
( b  O$ `2 }" u  {
1 ~* u& \2 B& N7 h    delete pIpAdapterInfo;
3 B# N" T; n. C5 @; G# E, K" `" ~1 C  }
& C: d5 O7 r( Y# r  4 n: b& Z4 j* J
  return 0;0 ?. O/ u4 }! K  E* z
}: ~( t5 ^! J4 O
/ P  K. J& |1 ~
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了