|
|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
9 B0 d- b- O: D' W
* C2 t2 T' L5 c7 q' l0 g* N$ N
D. P; h2 d: I" J, q; r( `9 A// 头文件包含
. u; v0 D I6 m- ^+ _#include "stdafx.h"+ E7 u0 s: ^: K7 l f
#include <WinSock2.h>
( {# h: ~ W D. T( m0 j#include <Iphlpapi.h>( ~+ i7 o# A! v" B
#include <iostream>
1 j/ C+ ^. L8 y* qusing namespace std;
1 c7 G) U2 u/ }3 h4 B! v// 函数声明
a* q+ y4 T* j3 {/ }void output(PIP_ADAPTER_INFO pIpAdapterInfo);
3 m. w+ y; ?* o3 [8 q* O: c A0 u// 程序入口, p5 q7 q+ q o$ E* l% x
int _tmain(int argc, _TCHAR* argv[])
4 p1 }# s) T) c# Y7 O* M0 B{
) _. {: x5 S, Q6 { //PIP_ADAPTER_INFO结构体指针存储本机网卡信息9 q- B1 _% w7 L$ v" L
PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO();
+ W4 {) c. e# X9 I+ Q$ S //得到结构体大小,用于GetAdaptersInfo参数8 L. r/ t$ R9 `" _; E' h0 y* @( e
unsigned long stSize = sizeof(IP_ADAPTER_INFO);9 [: _; s S, N$ s- E E
//调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量;其中stSize参数既是一个输入量也是一个输出量: C, { J0 {. ~/ R( h) j8 q5 L
int nRel = GetAdaptersInfo(pIpAdapterInfo,&stSize);1 H0 t, x9 I1 m. I0 V
if (ERROR_BUFFER_OVERFLOW==nRel)' ~, F. _7 k9 y) k$ J- r: g4 C
{0 E& {0 m: B" G4 \6 E5 m/ E# \" t
//如果函数返回的是ERROR_BUFFER_OVERFLOW
; u& ^" n" w z4 U! ?+ X; u //则说明GetAdaptersInfo参数传递的内存空间不够,同时其传出stSize,表示需要的空间大小
5 I7 M: {0 u9 b6 v //这也是说明为什么stSize既是一个输入量也是一个输出量: J4 {$ z# P. S0 J/ U
//释放原来的内存空间 F! r5 [9 S$ S; b: K; [
delete pIpAdapterInfo;
7 c9 |$ P7 S+ q //重新申请内存空间用来存储所有网卡信息$ V3 ?$ [; [0 o# W7 W% T6 \4 @
pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize];: I7 x- W7 J2 c* V9 |
//再次调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量
7 @: G+ C% X1 [ W% k) x4 r nRel=GetAdaptersInfo(pIpAdapterInfo,&stSize);
; u( q- G2 _- T6 t9 U: N$ v }9 \# L& k5 a0 X! W
if (ERROR_SUCCESS==nRel)
* y5 _* A, t1 `; ?, ~. p5 S1 a {
9 o: p& d0 x' [9 c% q. Y //输出网卡信息7 L. V/ \. s; I- V$ V6 R
output(pIpAdapterInfo);
0 q; x: o$ p& T5 q4 i }! T! J3 R, w% O L7 L, S
//释放内存空间& e9 g0 ^; U) v6 I
if (pIpAdapterInfo), ~- |- I% c: A4 t* \1 H
{5 q2 S" b) N3 W3 n: [7 T
delete pIpAdapterInfo;
5 }! y3 Z1 ?! G }
1 Z7 q( v! z) l$ H6 c$ q# ?8 h3 v getchar();( r7 l7 ?, j7 `" a' H x+ ~
return 0;+ v) D0 ]& s6 A1 O; z$ i
}
' E5 ^8 y. }: Y4 n0 o2 W///函数作用,输出网卡信息; p/ }* k- `7 B; T
void output(PIP_ADAPTER_INFO pIpAdapterInfo)
* l$ R: ?$ E& f! A% q{4 u4 Q6 t3 }/ n: G0 g
//可能有多网卡,因此通过循环去判断+ w J5 p- x" K
while (pIpAdapterInfo)
, y" [5 z) E, s6 s; t {
L5 `+ A3 o& l! J, k' Q cout<<"网卡名称:"<<pIpAdapterInfo->AdapterName<<endl;
7 A5 M4 x' n9 b8 I- m9 u cout<<"网卡描述:"<<pIpAdapterInfo->Description<<endl;% {; e- @8 i9 y
cout<<"网卡MAC地址:"<<pIpAdapterInfo->Address;# E; m$ ]( {1 g+ s6 `! Q. N
for (UINT i = 0; i < pIpAdapterInfo->AddressLength; i++)
; T- W2 M% r% d/ i if (i==pIpAdapterInfo->AddressLength-1)$ P9 f0 J2 Z: d
{9 I9 _( w& [ G, Y& s
printf("%02x\n", pIpAdapterInfo->Address);& o- V9 H5 b* }. p/ d: [8 s
}
s9 D& I6 f1 v8 C8 f+ ^0 R else
/ H- ?# |1 L+ ~2 [, \ {
8 N% V/ h# \. V% P- \ printf("%02x-", pIpAdapterInfo->Address);/ D. }( B5 W; B- I# F+ R `# }6 `
}- v/ Z4 C( O- u# J5 w6 {, r
cout<<"网卡IP地址如下:"<<endl;
" w1 f8 k% o; X- `: R) I //可能网卡有多IP,因此通过循环去判断( S8 n0 v4 h! V4 Z0 i( b+ |, @
IP_ADDR_STRING *pIpAddrString =&(pIpAdapterInfo->IpAddressList);+ ~- {: s2 E# h& _
do
! P- E4 |' i* U% i5 h9 i {% u2 P8 b2 X% K" R2 J& y
cout<<pIpAddrString->IpAddress.String<<endl; C6 x9 |7 _$ p; G( M/ Q, u
pIpAddrString=pIpAddrString->Next; g8 t4 B9 k' o( `: _' u" @
} while (pIpAddrString);
, T/ I: j( v; R. C+ h! d pIpAdapterInfo = pIpAdapterInfo->Next;
( z& O2 @) |4 o+ t4 V cout<<"*****************************************************"<<endl; A3 `* y' X1 ?8 n5 _
}
/ h7 Q# `( v- \; f2 `1 K return;5 K4 k+ V3 l/ @
}7 T7 P; U E+ i6 h* S9 E- ]
|
|