|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
" r9 m( g) [4 z+ b4 h( G" R4 w1 U
) r7 `9 F8 s+ n6 Y" w! P- N// 头文件包含, w2 ]& X/ W+ V& a- }8 ?
#include "stdafx.h"
+ G8 a( L# q% |7 u3 a+ t7 B3 _9 m# u#include <WinSock2.h>
2 u/ C; @, t- C, q2 n" x- g#include <Iphlpapi.h>
8 W5 `, j5 U& R4 k/ r, p, N2 @#include <iostream>: ?3 c$ y! C8 \ u+ Z' L2 } n
using namespace std;
+ T9 }; Q. J3 ^3 `% F// 函数声明 a3 ?$ A5 G2 z
void output(PIP_ADAPTER_INFO pIpAdapterInfo);6 r: }; G0 C* }2 W8 e) W0 k) @9 h+ i V7 D
// 程序入口
, w# _2 o. c; x8 H1 ?int _tmain(int argc, _TCHAR* argv[])
; L$ u* r/ y1 d) a) F! D{
( W- [8 f8 m6 u& t4 G( i" Y1 H1 q //PIP_ADAPTER_INFO结构体指针存储本机网卡信息
$ I$ L4 L3 O$ |) R# i. b PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO();" G6 b& }9 Q* {6 {/ Y
//得到结构体大小,用于GetAdaptersInfo参数# U2 d4 w% r8 U# p6 M0 w/ f
unsigned long stSize = sizeof(IP_ADAPTER_INFO);1 ]# |2 h2 ]; H3 ~4 j L! }
//调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量;其中stSize参数既是一个输入量也是一个输出量
+ K2 E- Q7 Y* Y) y) P" `; g6 V int nRel = GetAdaptersInfo(pIpAdapterInfo,&stSize);# {- {# r" E' j" k
if (ERROR_BUFFER_OVERFLOW==nRel)
. |) g1 m1 ^3 F6 c {) h+ r# R6 w3 C5 a( v8 q
//如果函数返回的是ERROR_BUFFER_OVERFLOW7 Q! g2 [5 T" S( j
//则说明GetAdaptersInfo参数传递的内存空间不够,同时其传出stSize,表示需要的空间大小
$ H8 g* T0 i9 z" r+ P7 t //这也是说明为什么stSize既是一个输入量也是一个输出量
]1 }, [8 P( j5 @ //释放原来的内存空间. ^. \, z) V1 Q/ G* M* O
delete pIpAdapterInfo;9 f y- @+ `( t4 A4 _# l% d
//重新申请内存空间用来存储所有网卡信息
# C& g0 N( @5 G( \7 |( z pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize];4 E# H5 J8 G9 q' F" f& p. L2 B# P
//再次调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量
) |3 S0 m) |% f nRel=GetAdaptersInfo(pIpAdapterInfo,&stSize); * X4 {5 v+ L3 x8 z) Z
}; m" M7 ?' o2 V+ x. l1 V6 T( Z
if (ERROR_SUCCESS==nRel)
! T3 v4 l; {3 T* g, g& A% h {
7 `. f# p& a1 g# T //输出网卡信息
u6 `/ @0 C) z2 E' W output(pIpAdapterInfo);; g7 ~- U" Z: m* h- P3 A; F
}. i# M" d5 z4 x6 W4 s
//释放内存空间9 i; `! `4 H+ X1 Q
if (pIpAdapterInfo)# a" c2 m. m! \2 N
{
7 x% Z- y% C% X7 j* ]' e delete pIpAdapterInfo;
6 j7 f) \6 j8 F }
- H& u3 d# v. b, e8 g getchar();
, ?) J$ l/ O6 ] Y$ V( G return 0;" B5 G3 n8 f j. |; _( C" q
}
3 C# x. |3 |# ]7 H///函数作用,输出网卡信息
$ f- u, ~' {3 _, |) b( F# R* n) x5 Hvoid output(PIP_ADAPTER_INFO pIpAdapterInfo) w& u6 s2 D9 Z. Z- G
{
( E) V8 h+ |2 ~! p$ I //可能有多网卡,因此通过循环去判断
' `8 \ g0 n# ~6 Q, v while (pIpAdapterInfo)
2 f- R- Q/ W; f# p/ H {
M! p3 W, d ~, J7 Z% \/ X cout<<"网卡名称:"<<pIpAdapterInfo->AdapterName<<endl;
0 g9 q. _( L7 O7 F9 j! J4 V* I. `+ M cout<<"网卡描述:"<<pIpAdapterInfo->Description<<endl;5 ^/ `* U2 {4 w, s% f" ]" Q
cout<<"网卡MAC地址:"<<pIpAdapterInfo->Address;- ?7 h5 ^ Q; J( J: p2 Q, V6 z
for (UINT i = 0; i < pIpAdapterInfo->AddressLength; i++)7 k* @6 D/ X4 H; G$ ]" _
if (i==pIpAdapterInfo->AddressLength-1)" D1 T4 {" l# w' {, V: ]* P% \0 F
{
& R! t$ K |3 b2 U0 K/ M printf("%02x\n", pIpAdapterInfo->Address);4 m9 @7 ^6 j% [" o; |
}! Q7 ~6 q: ~* N [/ T/ h
else
3 R9 f9 N; \; s7 ^4 g+ O {2 r. b' S# A+ v @+ x! w
printf("%02x-", pIpAdapterInfo->Address);
T& r, ] m% G- p/ k* [" x }
3 ^7 G1 ~0 Y+ ^4 v3 p+ O- i cout<<"网卡IP地址如下:"<<endl;
8 g, J( g3 s7 p) K. v3 p6 |7 I //可能网卡有多IP,因此通过循环去判断4 l" _' j: B) d6 _ A. A. A5 H" c) T
IP_ADDR_STRING *pIpAddrString =&(pIpAdapterInfo->IpAddressList);6 W$ j0 _" x$ c X4 s4 ?" V
do ) B" N* Z) x. B) e5 l. P5 u8 s G
{
. t- Y* h3 o2 k cout<<pIpAddrString->IpAddress.String<<endl;% `- `3 I8 m# a0 o
pIpAddrString=pIpAddrString->Next;: I: O' X6 P) Q' d. ^/ K
} while (pIpAddrString);
3 m& c* J# i- A pIpAdapterInfo = pIpAdapterInfo->Next;
' j3 K+ T6 w+ ^6 i7 J7 `1 ~ cout<<"*****************************************************"<<endl;
# N8 J% R' J z+ j }( f5 d4 p4 g C
return;
! w7 f8 T. c9 p: s* L}$ U: F; _. u) i0 S* c3 u
|
|