|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
: K5 P+ y# i8 J& J: j7 Z$ u
/ y( }; J3 F e3 R4 Q4 I: n: I
0 c$ A! [" I( u q' D$ `& |( ?5 t// 头文件包含
& C/ z9 {: q, S+ q, k5 _#include "stdafx.h"
* x! Y) Z6 c# A. u: v#include <WinSock2.h>
/ n& P! D9 F/ f, c( x- d#include <Iphlpapi.h>7 N6 E) n9 q0 G9 K) h8 R8 n; f' F
#include <iostream>9 N9 t' g0 U3 l8 k- ]
using namespace std;
; L$ X& L4 V# A9 q: F, r// 函数声明, q% n! |0 `" l
void output(PIP_ADAPTER_INFO pIpAdapterInfo);
' B8 \* b& G* W" i3 x// 程序入口
$ h; B4 U3 c' `1 l0 J8 L5 Rint _tmain(int argc, _TCHAR* argv[])' X: K2 m. k6 o/ {% p
{
8 i7 S5 s( N" K- d8 {* E6 e //PIP_ADAPTER_INFO结构体指针存储本机网卡信息
) S2 U9 V+ i' O& s& ^: n/ x3 F! k N PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO();
% x9 s1 Y8 h0 c, Q/ v8 _; d* s: y //得到结构体大小,用于GetAdaptersInfo参数
* z% F& }0 s; A% Z# K. x/ | unsigned long stSize = sizeof(IP_ADAPTER_INFO);
# l3 x6 R/ p0 s9 n //调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量;其中stSize参数既是一个输入量也是一个输出量
. h( w8 w! P, T, r int nRel = GetAdaptersInfo(pIpAdapterInfo,&stSize);
& T' p$ m, |/ M0 j2 Q( z& [ if (ERROR_BUFFER_OVERFLOW==nRel)
% B. I3 w5 o3 b) G* B {0 B; ~8 t r& I# S A4 F
//如果函数返回的是ERROR_BUFFER_OVERFLOW; b$ |- ~8 ^; K% D) F- L! w1 i' R9 q
//则说明GetAdaptersInfo参数传递的内存空间不够,同时其传出stSize,表示需要的空间大小
# G7 j( |6 o2 x+ z0 L- o$ d0 S3 M //这也是说明为什么stSize既是一个输入量也是一个输出量
. V$ l- D) y4 e2 z //释放原来的内存空间
! b: \/ m2 ?% ?& d, z7 |' l delete pIpAdapterInfo;
- ^) P/ s7 F* e$ z, u1 ~* F- J- ] //重新申请内存空间用来存储所有网卡信息
& W7 C* \4 |$ v' ? pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize];
) b1 d- O7 Y9 N" {& r //再次调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量
# Q) {% `; B6 Y: | nRel=GetAdaptersInfo(pIpAdapterInfo,&stSize); + _) n" Q" t- g. P2 @# Q/ m% ~3 E
}
7 z' v2 i* r; S6 ~0 x if (ERROR_SUCCESS==nRel)
5 o! h% W0 r1 K9 r9 F+ ?$ p! j {
+ k& w5 V; K# g7 S4 f2 H# ? //输出网卡信息' `& N+ n ?+ ~7 v5 k1 Q
output(pIpAdapterInfo); ~$ M. K6 j" d5 J; q/ E
}5 n: |, y7 j# ~( @, Q) W! z' Y
//释放内存空间* {* X9 C7 h9 v4 W* N* {
if (pIpAdapterInfo)1 ?0 R! S) a6 _& H* z
{" B+ ]' _! G; u$ A/ ?
delete pIpAdapterInfo;
% p1 l. W$ g1 d/ X" ?& \8 Z7 m9 h0 | }
- @! ]: ^( m0 m getchar();3 Z/ d/ N5 F r7 ~, ?: B
return 0;$ i" i+ Y6 i5 T) p0 F, e! ]5 _
}
" G' J7 o# Q) y9 T- o: B///函数作用,输出网卡信息0 Z" ~+ G( s% K6 K) a
void output(PIP_ADAPTER_INFO pIpAdapterInfo)$ u+ L1 J3 {+ M! }& b. W' m
{
& m* v* j, H# o& B4 }! r" L8 m: O# M //可能有多网卡,因此通过循环去判断- \. F- n; _0 F) @
while (pIpAdapterInfo)
& S! e1 x0 I6 P2 a0 g! E {
0 R0 U5 ]/ d- c6 {. {' T cout<<"网卡名称:"<<pIpAdapterInfo->AdapterName<<endl;( o; d8 i: {6 ]& d9 e
cout<<"网卡描述:"<<pIpAdapterInfo->Description<<endl;
) U0 u2 U! R. N2 R8 P9 O5 V$ ]0 | cout<<"网卡MAC地址:"<<pIpAdapterInfo->Address;
Q, j- A) m8 x" O# A for (UINT i = 0; i < pIpAdapterInfo->AddressLength; i++)0 X. x9 C7 F. a3 e- C' W
if (i==pIpAdapterInfo->AddressLength-1)4 P( G. ~0 E. {* B
{
" b* D! c, H( d- |6 \* p/ K& G) _ printf("%02x\n", pIpAdapterInfo->Address);2 x1 D$ Y4 {- Q/ y+ P$ F& }
} b Q7 f2 i( V' t9 V }
else, d. {* \& X& S) z
{* j& P) @, ^+ C7 M+ B* S4 A! ?
printf("%02x-", pIpAdapterInfo->Address);
; q3 N, f u& x( `5 W }
& r% s' T2 O! ?* t9 v8 ~ cout<<"网卡IP地址如下:"<<endl; l+ K4 X- ~$ g, t0 V( [. ?
//可能网卡有多IP,因此通过循环去判断3 q2 }8 ? y- X3 u, y% i# ?5 a, S
IP_ADDR_STRING *pIpAddrString =&(pIpAdapterInfo->IpAddressList);
: v" X K h, v R& F do g; c" t0 n4 Z, f( h5 a9 O
{
" W& m6 X; ~6 ? cout<<pIpAddrString->IpAddress.String<<endl;
) w4 E) I: v, @3 E pIpAddrString=pIpAddrString->Next;2 ?0 @9 g/ B/ h; F! |; c" r/ v( c
} while (pIpAddrString);7 G- F" _; N3 `) M3 V
pIpAdapterInfo = pIpAdapterInfo->Next;
! D1 W& e5 p# p. k% Y! z cout<<"*****************************************************"<<endl;
9 T2 @" P2 E" K- s }* H; F8 [. w4 Z% x
return;: R C6 @# r* q: S
}
( S8 L; e0 j# M5 }; U/ b% V4 R8 N( x |
|