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

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

[复制链接]

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

2470

主题

1275

回帖

8万

积分

管理员

PLM之家站长

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

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

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

x
#include <WinSock2.h>6 g) A5 w2 u* @5 W/ z  f7 K
#include <Iphlpapi.h>  h3 t8 D9 Z8 E) P. T) {& J. m
#include <iostream>/ [/ C# Z6 m% l
using namespace std;
) C9 C& d; Q5 N# _* E. g#pragma comment(lib,"Iphlpapi.lib") //需要添加Iphlpapi.lib库
" G; M$ k; w  Y6 N4 r) }6 R: S/ w* ^7 b( P# H" C
int main(int argc, char* argv[])
3 t' |4 Q; Z8 ~{* J) p4 K" m) a& W5 h2 M7 y0 n  H" w
  //PIP_ADAPTER_INFO结构体指针存储本机网卡信息4 \. Y% E8 R6 F
  PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO();& f+ O1 C4 i# Y# N: ~0 {
  //得到结构体大小,用于GetAdaptersInfo参数
" n5 c+ u4 e) T- M# W' `; C  unsigned long stSize = sizeof(IP_ADAPTER_INFO);( D1 l" z; y- ]: ~7 }+ S) n" z6 t
  //调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量;其中stSize参数既是一个输入量也是一个输出量
0 f" j3 u, v* k4 B3 L. i3 N  int nRel = GetAdaptersInfo(pIpAdapterInfo,&stSize);
0 B+ L- }  y. E4 @+ Y  //记录网卡数量
" x0 d9 q5 X& m7 H  int neTCardNum = 0;: K/ k+ ^1 _3 {. T9 U! L
  //记录每张网卡上的IP地址数量
7 q; c2 O6 e: C2 u  int IPnumPerNetCard = 0;
# ^* d* v0 o( X* q' P5 j8 ?$ w  if (ERROR_BUFFER_OVERFLOW == nRel)+ Z0 r7 E* \, {7 _3 K  h
  {) J. @( i) @, K9 Q) ~
    //如果函数返回的是ERROR_BUFFER_OVERFLOW" `: F! Z4 i9 {$ U5 ~8 W" d
    //则说明GetAdaptersInfo参数传递的内存空间不够,同时其传出stSize,表示需要的空间大小
) {8 Y, q' _; b' ^+ O6 n- O# `    //这也是说明为什么stSize既是一个输入量也是一个输出量& ?0 K% V) V, g0 E  H* c6 Y; `
    //释放原来的内存空间
8 k! e/ ?5 g: ~0 ~1 J    delete pIpAdapterInfo;
% |* p. b3 J. T8 I2 O% a    //重新申请内存空间用来存储所有网卡信息+ j8 L7 u  c6 y; `& b* Y2 q
    pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize];
- S! t* b% o/ E' o7 @4 F  d    //再次调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量
9 y4 T% o" H6 J0 ~  {9 Z, {0 ]    nRel=GetAdaptersInfo(pIpAdapterInfo,&stSize);  
# r6 W% C5 R( M4 o  }
- ~) }  [( B/ a  if (ERROR_SUCCESS == nRel)
3 e: n* ^5 _  @3 c/ R  {
& r, L) n' M: o  Z2 I" [$ v    //输出网卡信息9 }, V, P6 Z& B( J' U  C) y
     //可能有多网卡,因此通过循环去判断  S; c6 c* R, v3 z* Y& y
  while (pIpAdapterInfo)# X0 c7 Y2 e  R3 l0 `. G8 E; G
  {8 O' @3 W0 U" ?% O% J% v5 I, Q
    cout<<"网卡数量:"<<++netCardNum<<endl;
0 ^( R3 W8 U0 k, r    cout<<"网卡名称:"<<pIpAdapterInfo->AdapterName<<endl;& Q9 k! p: A* T( h1 S, g
    cout<<"网卡描述:"<<pIpAdapterInfo->Description<<endl;3 T) }& Q2 c: a9 A" w; u
    switch(pIpAdapterInfo->Type)* N# y* v3 ^; J4 |
    {7 h+ t2 }, h  E6 |; R; ]
    case MIB_IF_TYPE_OTHER:
  N1 d/ e( e/ w/ s3 a! H      cout<<"网卡类型:"<<"OTHER"<<endl;: T, t% A: R: ~1 T9 G7 |9 [
      break;9 h8 O* ~9 r; L9 |7 x. i, m
    case MIB_IF_TYPE_ETHERNET:7 k9 G, @5 |0 T1 d: o
      cout<<"网卡类型:"<<"ETHERNET"<<endl;9 s# c* ~4 l( f- `- O
      break;! a+ C) h& p5 J, m) C4 _2 s
    case MIB_IF_TYPE_TOKENRING:
( c5 N8 |) L$ H, ]8 p0 K      cout<<"网卡类型:"<<"TOKENRING"<<endl;( h: k" _) _) a0 k; |
      break;7 |" Q  r% J% g7 D6 J
    case MIB_IF_TYPE_FDDI:
% r: H8 {3 F3 j) _7 J      cout<<"网卡类型:"<<"FDDI"<<endl;1 u, D) ?2 Y# y) Z* D
      break;. ~- j9 `% W5 }$ K
    case MIB_IF_TYPE_PPP:
" r( K7 k, a# E9 f: b8 T& Q, D0 T+ h+ ?      printf("PP\n");
$ |0 V- J) h! _- o      cout<<"网卡类型:"<<"PPP"<<endl;
- \* B" Q$ q2 S0 C      break;
7 n" f4 K( c3 V0 ^. S  {( i0 d    case MIB_IF_TYPE_LOOPBACK:" l1 R2 ^1 H/ @# a0 |! S
      cout<<"网卡类型:"<<"LOOPBACK"<<endl;) L+ h3 W" }/ E, \1 \" p4 _" `
      break;3 H8 Q- r1 L3 m8 P  [. Q
    case MIB_IF_TYPE_SLIP:
' ]) F! l. Q! Y" p      cout<<"网卡类型:"<<"SLIP"<<endl;, Z* v8 F: z6 u, f+ H
      break;- h8 v6 P- o* ^! R
    default:
3 M3 G6 D! z' ^0 f: M; y) d  ~, |  v  B) q9 a
      break;
8 @- h2 \$ g2 N0 y- G& v! ]    }" A- `) G) i' ]0 u
    cout<<"网卡MAC地址:";
. J4 r4 n& [6 J4 J2 }    for (DWORD i = 0; i < pIpAdapterInfo->AddressLength; i++)& L& E; ?* _4 t' h+ h( R- M- }
      if (i < pIpAdapterInfo->AddressLength-1)
' }( H. `* V6 y; B: i; I" d      {
0 g5 r8 E2 s# U9 F! G% [# K        printf("%02X-", pIpAdapterInfo->Address);
; i( }, `+ g/ E+ ]      }! C6 U6 U% I5 b, ~" Q
      else6 }1 M- m' m( N  [* J& J/ b
      {
: G" f6 x# a' i9 B+ N  |, b# o; F        printf("%02X\n", pIpAdapterInfo->Address);3 t4 q! H- ?  E
      }
* ?9 T6 X" c' s6 ~1 z      cout<<"网卡IP地址如下:"<<endl;
1 l# c6 O+ |/ S# m; g      //可能网卡有多IP,因此通过循环去判断# k. @  h  A$ I% z7 g7 V5 Y
      IP_ADDR_STRING *pIpAddrString =&(pIpAdapterInfo->IpAddressList);* r& U2 O# O( ]- H" B
      do
$ v% t# O0 E4 N      {
* e3 Y. N' T. l        cout<<"该网卡上的IP数量:"<<++IPnumPerNetCard<<endl;
; x- A& E' d6 ?5 c' V: y        cout<<"IP 地址:"<<pIpAddrString->IpAddress.String<<endl;
$ D# @1 q; O) ~+ e3 o" A        cout<<"子网地址:"<<pIpAddrString->IpMask.String<<endl;# {/ L- d- ^2 Q9 X0 ]
        cout<<"网关地址:"<<pIpAdapterInfo->GatewayList.IpAddress.String<<endl;
/ q+ V. j% r8 T, G. t: P. r3 Z        pIpAddrString=pIpAddrString->Next;
0 l4 {8 m1 T1 ~  }8 q3 n& _2 P" l      } while (pIpAddrString);" B7 w- H  N/ a& a; O. [
      pIpAdapterInfo = pIpAdapterInfo->Next;5 O$ D9 O6 ^; T7 t1 \: w' Z
      cout<<"--------------------------------------------------------------------"<<endl;
1 q' |  W" J/ d% X2 `0 p1 c  {  }0 K& c2 X. p: X' ^  D% W
   
, l! ]- W8 d+ p5 p6 [: p# o  }
; {6 h) v. q- X) e  //释放内存空间$ ]- x/ G5 p# g/ l
  if (pIpAdapterInfo)
7 \% I: ]* N. M! c  {, T1 }  l" c( }
    delete pIpAdapterInfo;
+ K5 @# a! ]8 Z. p6 r  }
* X) _' d  V/ ]: h4 @  3 F9 [1 N) `% H) S: S& N
  return 0;% Z/ @7 ^3 b+ I. L7 P0 x
}
/ ^2 n% d; |3 d+ R
, H. r, {2 r3 c4 I' q& F5 ?+ F
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了