PLM之家PLMHome-国产软件践行者

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

[复制链接]

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

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

admin 楼主

2017-10-17 21:05:45

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

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

x
#include <WinSock2.h>+ |  r8 o' |0 ^" E  e, h/ o
#include <Iphlpapi.h>
) M4 {+ S( S* F5 A9 g#include <iostream>7 \  M' C: K' l) k+ t- `8 S- v
using namespace std;
; L+ D9 b3 X# }' _; K. U9 E#pragma comment(lib,"Iphlpapi.lib") //需要添加Iphlpapi.lib库
3 c! K% R$ e1 j- Y7 a1 k, j8 r& t, Y& X7 H; S
int main(int argc, char* argv[]): q. ~5 y. C1 V3 c3 H) n0 ]
{
. }: G) j7 r5 B  //PIP_ADAPTER_INFO结构体指针存储本机网卡信息& J' V5 M! t  u1 F2 b, b) b6 g3 a
  PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO();
/ _) v. Z1 ]2 V  //得到结构体大小,用于GetAdaptersInfo参数, u$ W5 W! ]" }& |' M$ J; P6 H5 s; _
  unsigned long stSize = sizeof(IP_ADAPTER_INFO);
+ f$ H% V7 ^# a  //调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量;其中stSize参数既是一个输入量也是一个输出量$ `+ E3 _1 {4 K  i0 P6 B8 N
  int nRel = GetAdaptersInfo(pIpAdapterInfo,&stSize);2 G" A! Q6 A; X1 y1 I/ n  m
  //记录网卡数量( C! l5 N; M: y0 @) J/ F
  int neTCardNum = 0;
1 Q& G5 g1 l3 b, V, a7 [  //记录每张网卡上的IP地址数量
) z8 g, E& m0 j* o' F) S  int IPnumPerNetCard = 0;
) m* a/ t/ m: D7 p5 a1 h, l  y  if (ERROR_BUFFER_OVERFLOW == nRel)# p; q, {7 b7 _$ @1 {
  {
$ d7 `6 H9 {, O% o8 ^( R    //如果函数返回的是ERROR_BUFFER_OVERFLOW) F6 L: L, h' N2 {
    //则说明GetAdaptersInfo参数传递的内存空间不够,同时其传出stSize,表示需要的空间大小
; t0 L. y. C3 F( k& t/ d    //这也是说明为什么stSize既是一个输入量也是一个输出量
5 q8 X7 G8 y) h( Q" z" A    //释放原来的内存空间
' t. ~. f- ~. S7 e6 z7 K  }! y    delete pIpAdapterInfo;
( Y: \6 a; b, G    //重新申请内存空间用来存储所有网卡信息
8 N0 g/ ]2 h8 n8 L( {. E    pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize];
( H6 ^& X* x  D) I" F: i$ r8 k; Z    //再次调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量" a7 M! Z- H" X0 M  D* z/ @
    nRel=GetAdaptersInfo(pIpAdapterInfo,&stSize);  
% D$ v; @+ }# q- h' f2 H  }
% ~! F/ L2 E8 c( }  if (ERROR_SUCCESS == nRel)
7 B7 o. \; q& p7 V8 ~  {  c/ Y4 j, W; L/ C9 s% x% }6 e* l
    //输出网卡信息9 J9 s! i7 f( t% i2 e' g1 @0 `
     //可能有多网卡,因此通过循环去判断
% B2 `6 P* W3 b7 y5 v6 ^# U! E  while (pIpAdapterInfo)
* I, B6 B' e' d: Z2 y  {
3 j' P2 `4 l0 V5 H6 T    cout<<"网卡数量:"<<++netCardNum<<endl;
$ ?% _% i& n2 X) @4 k6 ^! _    cout<<"网卡名称:"<<pIpAdapterInfo->AdapterName<<endl;
0 c( v$ R7 Q( V9 D    cout<<"网卡描述:"<<pIpAdapterInfo->Description<<endl;
$ f5 Z" R. t" X! B9 R1 k    switch(pIpAdapterInfo->Type)# `2 w, L8 D% s7 L, F
    {7 m+ @. k, w/ ^6 R* X* S7 a
    case MIB_IF_TYPE_OTHER:
4 i3 w3 |3 G& J/ ?      cout<<"网卡类型:"<<"OTHER"<<endl;8 B, c( N, g  c
      break;
4 M' w! D1 c6 |0 k, ?    case MIB_IF_TYPE_ETHERNET:2 y$ Q; X, \3 b% e1 u
      cout<<"网卡类型:"<<"ETHERNET"<<endl;, @0 k$ Y# q0 R$ S& {  f
      break;
- e9 ?  u( }5 i# D4 D) W4 I    case MIB_IF_TYPE_TOKENRING:: m$ A$ L/ O/ \% n2 m3 v
      cout<<"网卡类型:"<<"TOKENRING"<<endl;
+ R' x2 c- o/ L$ W      break;, p2 }8 D9 I( n+ `0 v& V4 M
    case MIB_IF_TYPE_FDDI:
& W+ ^% a% x8 `' K8 Y" s5 n& Z      cout<<"网卡类型:"<<"FDDI"<<endl;/ `7 S$ v2 g+ \8 z4 ^' x
      break;
- w3 M/ F! \- a) u2 L) k    case MIB_IF_TYPE_PPP:
' [, s7 w7 f. W      printf("PP\n");# Z* L& P1 Y7 z: n) c* e
      cout<<"网卡类型:"<<"PPP"<<endl;
' r+ Y/ x# _% d5 v      break;$ x- V  ^, j5 E: W
    case MIB_IF_TYPE_LOOPBACK:7 A" B9 `) \2 P; \' x
      cout<<"网卡类型:"<<"LOOPBACK"<<endl;
6 s1 T2 e1 _" j! a3 Z      break;6 n- F8 R* m. H2 P1 n8 H+ U- b/ ^0 f% f
    case MIB_IF_TYPE_SLIP:
1 Y1 Q6 U8 y$ _# C% a      cout<<"网卡类型:"<<"SLIP"<<endl;
5 a5 u( B$ L% H7 S  g5 l      break;5 G: i4 P5 J; a3 t
    default:, K% C1 ?1 t+ E9 r/ K4 E
4 k  K. A, ]4 c7 X
      break;
% x' a" P$ ^6 u    }, g( f6 s& ~7 [# x* x/ x# O! Y0 i4 Y
    cout<<"网卡MAC地址:";
7 I! A9 d: ^1 W    for (DWORD i = 0; i < pIpAdapterInfo->AddressLength; i++)6 h7 v( @8 `$ J6 T' U) Y
      if (i < pIpAdapterInfo->AddressLength-1)4 j/ O# y* }, V" A0 @% l6 F  U
      {7 T, i7 F8 K- X. a
        printf("%02X-", pIpAdapterInfo->Address);# X3 ]9 x) t$ w8 e8 L8 R" U8 W  e
      }
  e, Z' u/ n7 l9 c, l) \/ s      else4 d' t8 n6 C0 s6 @% f* y
      {
9 W$ Y" g; i- h- z0 E: K        printf("%02X\n", pIpAdapterInfo->Address);  w3 s4 s' T+ R# t
      }
1 g0 ^/ T+ r2 _- a7 L      cout<<"网卡IP地址如下:"<<endl;
; W/ Z% H' K7 [6 u7 N6 u      //可能网卡有多IP,因此通过循环去判断
& {* C( i( U1 a' [      IP_ADDR_STRING *pIpAddrString =&(pIpAdapterInfo->IpAddressList);
$ @& w+ Q1 ]( R, @      do
+ T! N6 }- i+ N7 C      {: [" u. V8 R" f3 W% i# v
        cout<<"该网卡上的IP数量:"<<++IPnumPerNetCard<<endl;* B% l, X4 K7 H- |) A
        cout<<"IP 地址:"<<pIpAddrString->IpAddress.String<<endl;
9 `" e! d1 k" M8 ^        cout<<"子网地址:"<<pIpAddrString->IpMask.String<<endl;  z3 l0 W# N9 B- e( I# w
        cout<<"网关地址:"<<pIpAdapterInfo->GatewayList.IpAddress.String<<endl;2 x; I% z  y* q# F: R) \8 s: m/ {
        pIpAddrString=pIpAddrString->Next;
" [: y  r* u* n, X4 Q! D$ }      } while (pIpAddrString);
: O: ]0 V1 \3 U3 z5 z. g/ y7 n      pIpAdapterInfo = pIpAdapterInfo->Next;
! O& M2 D9 I9 ]8 l      cout<<"--------------------------------------------------------------------"<<endl;% |4 d  G. v9 `; S5 j* X
  }
' U, U! x, }! @$ I   . c/ K# W& W9 Z/ F# b# T
  }
, R1 E! R  R; P5 q- B) y' G  //释放内存空间
/ }% _0 H( ^% p- b6 Q5 F$ U  if (pIpAdapterInfo)
/ @0 O5 `! f2 P# g; @; k( l  {
' }7 B+ c# z9 P1 r    delete pIpAdapterInfo;
9 J4 C$ |* {2 M3 G, g) |" G  }
5 P* G# L+ s$ [9 K- j0 {$ {  
5 a' G( R4 y( h, Q; J# Y+ z# J' H  return 0;! S* i6 v6 w! A, t
}
/ W6 F9 T) X, @# |) O
* U( V; i& j" ]' A8 G# K
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了