|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
* i7 G3 W/ U- F6 p
! e1 ]0 F, b8 ^: |; i
h n( E/ X+ {6 c- m// 头文件包含
# h5 K0 h- N. P; t8 H9 h. O#include "stdafx.h"
$ }3 x3 i$ @* Z. ~1 G#include <WinSock2.h>
) P- g/ X3 P! |) u( G, a#include <Iphlpapi.h>
% Q% C- n' v" _ c9 c8 n; f# Z#include <iostream>
/ L; H9 ~8 J" z& kusing namespace std;% \( `( ?3 ]% \1 k6 h3 B& |+ j
// 函数声明
& `& y5 F1 g7 k* T) x6 gvoid output(PIP_ADAPTER_INFO pIpAdapterInfo);
, P! d" k( Y5 e// 程序入口# h1 |" k7 P" x# B$ O+ N' w7 W$ P
int _tmain(int argc, _TCHAR* argv[])& z! ]0 t3 Z5 ^1 t+ R" \, a% `) c
{# t5 d% q6 x5 {% J/ t. ^# b
//PIP_ADAPTER_INFO结构体指针存储本机网卡信息
9 G7 }9 j. g4 S" G PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO();
7 ? o. h( D7 A5 } E' P# v8 y& s3 Q; g //得到结构体大小,用于GetAdaptersInfo参数
2 d' {! |3 S2 H$ C$ B9 X" b unsigned long stSize = sizeof(IP_ADAPTER_INFO); R" g `( M& L8 S7 S9 T5 _
//调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量;其中stSize参数既是一个输入量也是一个输出量. K& z! s! u$ C' _- l
int nRel = GetAdaptersInfo(pIpAdapterInfo,&stSize);
& H4 w) A. I+ v: \. s& f if (ERROR_BUFFER_OVERFLOW==nRel)- r5 `0 Z B7 [* v4 ?) P
{
: g8 b# W* g! o) y //如果函数返回的是ERROR_BUFFER_OVERFLOW
: p& O0 T# I& }, w! b6 C //则说明GetAdaptersInfo参数传递的内存空间不够,同时其传出stSize,表示需要的空间大小5 ]$ r, n) h. m
//这也是说明为什么stSize既是一个输入量也是一个输出量
. U/ r* B) }+ J //释放原来的内存空间
6 I+ C$ q4 z; K0 Q" n$ E. } delete pIpAdapterInfo;* i0 G& s6 d" d4 Q
//重新申请内存空间用来存储所有网卡信息 a: L. k7 l1 U
pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize];; W) N' p0 K3 s* _5 C9 J( Y' X" A
//再次调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量' z3 W" |, ^+ v' r9 ]5 T: L( K4 h
nRel=GetAdaptersInfo(pIpAdapterInfo,&stSize); : |7 O7 O) W) j8 \/ a. V3 ]5 b
}: S1 ]( t8 D# ~# x
if (ERROR_SUCCESS==nRel)
$ V# U+ N2 j! _( b$ t {
9 S% W0 A, K5 C+ x //输出网卡信息) v. T d2 u: S6 Z' k: k
output(pIpAdapterInfo);) P, r5 x- Y: \5 e: i8 C# N
}
" u/ k- u4 Q$ @- ] //释放内存空间2 ?# Z. s. D) Q% Q, b
if (pIpAdapterInfo); s* C9 F/ m, c. ]0 R* B5 N
{
5 J3 u5 j* b p delete pIpAdapterInfo;
, y" c2 `% j! [3 C }6 L s6 ~" O* }7 r
getchar();) R9 C' V3 z# I x
return 0;
- _4 v7 F# _* K# J& @8 q# T" M}
4 C% v4 [0 i( M! d; p8 ^3 S T///函数作用,输出网卡信息
" w9 X! P: G) _void output(PIP_ADAPTER_INFO pIpAdapterInfo), P, O& h4 a7 q
{
8 _* D A- V( L+ L //可能有多网卡,因此通过循环去判断
, x6 f& ^" T' J9 |& Q while (pIpAdapterInfo)8 x8 f, g; ?$ h
{
7 e% d6 z/ q1 r6 Y cout<<"网卡名称:"<<pIpAdapterInfo->AdapterName<<endl;( m. w6 T! ?5 E- |* o
cout<<"网卡描述:"<<pIpAdapterInfo->Description<<endl;% ~6 U' d/ n- W) a
cout<<"网卡MAC地址:"<<pIpAdapterInfo->Address;7 d$ b2 O# A. f7 |* V7 _7 |, \
for (UINT i = 0; i < pIpAdapterInfo->AddressLength; i++)
8 S1 d3 w* z* `4 o if (i==pIpAdapterInfo->AddressLength-1)' y# k3 J5 i. o+ z. N, R1 b4 R
{: O" F" \# X1 U' \' Y
printf("%02x\n", pIpAdapterInfo->Address);
5 h8 `; ?7 W- X# A9 z }( ^& r; K& x3 B$ P- s
else6 z3 e; Q2 {' r
{- e7 X. L9 H, |9 n: ]
printf("%02x-", pIpAdapterInfo->Address);$ t$ t- O4 A9 Q- v) S- `1 o
}8 J2 \# t; z: j- h( s$ K1 a
cout<<"网卡IP地址如下:"<<endl;
4 o" q) r8 n8 Y m3 c6 r" H //可能网卡有多IP,因此通过循环去判断
/ f& k) U- B1 h. m IP_ADDR_STRING *pIpAddrString =&(pIpAdapterInfo->IpAddressList);- }' @4 X3 b& N" ]3 @
do ; H+ G$ Q; ?$ A* \" l4 [. r
{
6 R$ a% m7 a/ Y, b" D cout<<pIpAddrString->IpAddress.String<<endl;
5 u# d5 H2 e4 N8 s pIpAddrString=pIpAddrString->Next;. ^! i$ Y1 s7 }, w$ R. E
} while (pIpAddrString);
/ @" f, d' k0 Z: C, X' O pIpAdapterInfo = pIpAdapterInfo->Next;
% {+ \: w- X# d- \) C! u1 T# u cout<<"*****************************************************"<<endl;" ?( n9 r* G" s" z- J
}
! H8 T% J, r& T2 w* u8 Y1 ^ return;$ i' t# o5 u! K" K, _. D1 b) N+ U c
}# n9 @# k2 M5 q& D1 }% i
|
|