|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
4 | x# r4 W9 K
, R& d: a" x- z8 t' N
% K7 U5 A1 a/ o' X4 p// 头文件包含) d& P* O$ q, V) N
#include "stdafx.h"/ G; \, G7 @/ h* G+ J/ x+ K
#include <WinSock2.h>
% z. _. z" `, X#include <Iphlpapi.h>
! L/ ]( F, r, B9 w/ a+ u#include <iostream>; p1 r6 U" d" ^8 b ~
using namespace std;
K- r+ W2 t1 \3 n( V" ^; M/ d// 函数声明
: C" q5 O6 E- L0 g$ a( lvoid output(PIP_ADAPTER_INFO pIpAdapterInfo);, H) l% G8 P* w7 o' s! u
// 程序入口
8 x0 s: l6 I( u2 t2 qint _tmain(int argc, _TCHAR* argv[])
& c' t. {$ A* N& E4 ^{! ` L! M5 _: @0 C; N# l8 u0 v: Q
//PIP_ADAPTER_INFO结构体指针存储本机网卡信息
7 F, x; ]5 f1 c7 n+ E# G5 y) e5 k PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO();
3 A8 `) M4 F* \, H //得到结构体大小,用于GetAdaptersInfo参数
# C) G& p3 ?1 E$ [" v unsigned long stSize = sizeof(IP_ADAPTER_INFO);2 f/ X5 M# Q3 {+ l. I! h+ D
//调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量;其中stSize参数既是一个输入量也是一个输出量( [; M$ E( l* F, U2 a
int nRel = GetAdaptersInfo(pIpAdapterInfo,&stSize);- a1 E6 }" c) V: e M) K$ S# U
if (ERROR_BUFFER_OVERFLOW==nRel)! H2 X! o+ Z4 V1 Q0 n; m
{' m4 _5 ]8 c% c5 s
//如果函数返回的是ERROR_BUFFER_OVERFLOW3 T. v8 i% P5 N) N8 D
//则说明GetAdaptersInfo参数传递的内存空间不够,同时其传出stSize,表示需要的空间大小
' U0 Z( h: B* D* k1 s8 k3 R n //这也是说明为什么stSize既是一个输入量也是一个输出量
# _/ `: ^' _' I. ]- V- d //释放原来的内存空间/ s K2 z$ z s8 ]* H0 r- H! ]% W" k
delete pIpAdapterInfo;. q1 _6 J9 [' _0 i3 E ]
//重新申请内存空间用来存储所有网卡信息
/ ~6 w. E; e8 @$ F3 ` pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize];
; S; t4 O9 ^) Y7 X* ? //再次调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量
* Q- R4 e0 J$ n0 N' _ nRel=GetAdaptersInfo(pIpAdapterInfo,&stSize); & a {9 S6 v9 [' a, o
}" p+ F3 d, Q# K2 N+ o! L7 g
if (ERROR_SUCCESS==nRel)
# i9 e, F# q' k0 A& k" C {
+ |4 s: c1 F( e% X1 y( n- N //输出网卡信息" K, ~6 ]) B% q' {
output(pIpAdapterInfo);
6 E( t; n0 ^5 @( Y0 s0 t }
$ C- O- w/ s' `$ H. w //释放内存空间2 e& L1 c: J6 b7 J5 G
if (pIpAdapterInfo)
) F9 R, d* Q9 ? {6 E5 a6 i# X; Y" z3 N
delete pIpAdapterInfo;
# o1 K' {8 C) ~ b+ f- ? }
1 ^# r' R) j" [# ^0 Y getchar();
1 P: w& I4 m$ ^5 X/ @& W, v return 0;
& j; ?" K d* C) f' ^* Y3 {# v}( |' n" L: g% |+ B9 ]; W. ^
///函数作用,输出网卡信息, r. w* F8 T6 a5 D0 p+ R
void output(PIP_ADAPTER_INFO pIpAdapterInfo)
8 q/ p' K6 ^; @; Q2 [) X{
! K* `! `/ |! B0 D. _& ?; J$ B //可能有多网卡,因此通过循环去判断
/ u5 k$ S; K, A: J7 L+ p while (pIpAdapterInfo)4 G) a0 l9 O; A4 H
{
0 f: ]. t3 ]- d" j% f) b cout<<"网卡名称:"<<pIpAdapterInfo->AdapterName<<endl;
/ y4 [" V& c$ d- ^ cout<<"网卡描述:"<<pIpAdapterInfo->Description<<endl; a. ]2 s6 s3 f( Z
cout<<"网卡MAC地址:"<<pIpAdapterInfo->Address;
/ K. S2 U* \& ?5 \. N. G for (UINT i = 0; i < pIpAdapterInfo->AddressLength; i++)% P6 u- p% p6 T; I1 J* a
if (i==pIpAdapterInfo->AddressLength-1)
, n8 Z6 r, Z7 B/ |8 ? {
- J* [1 V5 z6 ` printf("%02x\n", pIpAdapterInfo->Address);- H7 }7 y2 {! D5 a7 m2 D' j& u6 x
}
9 |8 H% X4 |: a$ k& j3 s else$ E8 u6 c* R1 d& U7 d
{- ~9 P2 T6 Y! e( L3 u" r
printf("%02x-", pIpAdapterInfo->Address);9 L5 z( U z% ~5 P( u2 q5 Z, r5 V
}) b. I6 ?6 ~/ P) l7 n
cout<<"网卡IP地址如下:"<<endl;; t- K) C/ c: g3 ?
//可能网卡有多IP,因此通过循环去判断$ v% \/ I" z( ?% F
IP_ADDR_STRING *pIpAddrString =&(pIpAdapterInfo->IpAddressList);
b' x( ^) z P$ v- D do 3 O4 B& \1 m4 R2 ? ]( K: [
{7 r3 X% i/ ^6 E( U: R
cout<<pIpAddrString->IpAddress.String<<endl;+ s1 ]6 Y) r! v
pIpAddrString=pIpAddrString->Next;8 p* l9 V1 S% T6 y8 j6 e+ M
} while (pIpAddrString);
: k# V5 {& n1 R2 r0 @7 ~4 [ pIpAdapterInfo = pIpAdapterInfo->Next;
1 O6 p! g, ~( V* x2 j cout<<"*****************************************************"<<endl;2 A3 v) T. B+ [/ X6 ?6 w3 Y( R
}+ t- r3 p+ S; T. v9 C K9 j
return;
& W: T, n; D0 l; U8 ?}
" W/ ^" b" V4 w) O: Z" Y2 k; b |
|