|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
( p1 n4 X4 x1 J0 h+ b. _
" G' r+ J/ b1 A, a* l' F" D; u4 F6 i( M2 T! t7 ~, x: G3 Y
// 头文件包含# v8 ]) p- L* }2 V1 }
#include "stdafx.h"$ N' z' R$ P. Z9 c
#include <WinSock2.h>8 a7 O4 c% M- z* e
#include <Iphlpapi.h>
9 S. H! r/ c v. V+ h5 P: A#include <iostream>6 S6 X% M0 _: b. ~9 a' } ]3 C
using namespace std;
C$ l" ?( e0 }# A// 函数声明' w6 x5 ?1 A4 W+ b
void output(PIP_ADAPTER_INFO pIpAdapterInfo);
* V. _# L# `- V' a' [) H$ }// 程序入口; U5 E1 g& x- P8 N% I N
int _tmain(int argc, _TCHAR* argv[])
, i2 |4 r& A5 H! E{
! V+ q, ?% m9 _ //PIP_ADAPTER_INFO结构体指针存储本机网卡信息. \" t# N9 H$ c( X. u/ X
PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO();0 u" e. u/ \. b }
//得到结构体大小,用于GetAdaptersInfo参数
2 u% T* \ y+ M, r unsigned long stSize = sizeof(IP_ADAPTER_INFO);" G( b9 G" ^$ t L3 t$ \5 G7 U
//调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量;其中stSize参数既是一个输入量也是一个输出量
& M% K2 C7 C5 W% Z0 | int nRel = GetAdaptersInfo(pIpAdapterInfo,&stSize);# U( E! ^! N9 {. E( D1 ~
if (ERROR_BUFFER_OVERFLOW==nRel)
. x6 k7 U: F6 X; p q" @ {0 I. ?) z5 @! R0 j
//如果函数返回的是ERROR_BUFFER_OVERFLOW) N; `8 K# G& i8 L# f2 K5 a, n) S
//则说明GetAdaptersInfo参数传递的内存空间不够,同时其传出stSize,表示需要的空间大小7 a7 T. h9 E( _7 P- n* S, ?% V
//这也是说明为什么stSize既是一个输入量也是一个输出量- ^2 v2 n+ R" O0 q9 j' b
//释放原来的内存空间& d, t" `; j+ H8 e( i
delete pIpAdapterInfo;, \; [" L, z3 Z2 w. j
//重新申请内存空间用来存储所有网卡信息6 q& s8 L, z% h9 y1 R- m
pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize];
8 ]5 x+ M9 p5 R+ h+ q _/ |2 e //再次调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量7 A$ r, }' [; T; Q0 g9 ^* z
nRel=GetAdaptersInfo(pIpAdapterInfo,&stSize); 2 M+ B9 Q! G$ n
}+ D! I1 }* Q% P0 T! N6 s f
if (ERROR_SUCCESS==nRel)+ Z, E( J% ^, P7 E9 j' Z8 g( _# R
{
% r& `, o0 m8 E4 r, J0 C //输出网卡信息
; P0 W; n$ j! o+ S6 y output(pIpAdapterInfo);# u, G1 F2 U* r. h
}
; J) M# m; |2 D/ i //释放内存空间
" d; ]2 ^* u- n0 c/ q0 ^ if (pIpAdapterInfo)9 ~% L9 x% H! r) t; ]3 a, V
{
# W0 C8 U9 ~; O. s- B/ u' H delete pIpAdapterInfo;
, ?0 f6 K! d7 C2 o' }! \ }. p+ \% E+ Z. q; J
getchar();# y5 ?/ i1 u& l1 P# u+ Y7 A% P
return 0;
4 t6 R' f* Q, l" S/ M0 B" P}
( p) E i* X4 ~* K- ~. F: Z- ?# O2 ^///函数作用,输出网卡信息
8 U# G% ]& U0 }( Xvoid output(PIP_ADAPTER_INFO pIpAdapterInfo)
+ @" l9 ^4 C# T! g$ O{
0 R5 _3 J& p2 A5 [& T L //可能有多网卡,因此通过循环去判断, y4 m8 i1 Z+ V9 C
while (pIpAdapterInfo)3 d, W7 i5 P5 [4 q
{ a; \' }" f% }: O, p% L6 ~6 t) l* w
cout<<"网卡名称:"<<pIpAdapterInfo->AdapterName<<endl;
" F8 j- T) z- }9 Z- s cout<<"网卡描述:"<<pIpAdapterInfo->Description<<endl; N( R9 p. F4 a) E# H& _
cout<<"网卡MAC地址:"<<pIpAdapterInfo->Address;9 ~( m6 z! Q8 N; e
for (UINT i = 0; i < pIpAdapterInfo->AddressLength; i++)
( ]$ C- f7 w4 {. w1 W if (i==pIpAdapterInfo->AddressLength-1)
4 Y0 ]4 M5 R7 b2 H+ N/ m2 x { c+ b" ~/ i" G( x5 X3 P: W9 \
printf("%02x\n", pIpAdapterInfo->Address);
6 q' S. X8 S) N* C! e/ K }7 i5 E8 A" n) ?+ _$ s/ q8 g- C6 R7 b; e
else; C4 r; k, J, S7 g) m$ I4 y! M
{: J- r, G4 ?9 f4 l R
printf("%02x-", pIpAdapterInfo->Address);
$ f) d$ m1 p2 y% W0 C' X# r }: B5 r6 i+ Y4 k* @) o
cout<<"网卡IP地址如下:"<<endl;$ C+ b1 H" L( r
//可能网卡有多IP,因此通过循环去判断
0 u1 A2 X1 \0 r/ y/ P d/ | IP_ADDR_STRING *pIpAddrString =&(pIpAdapterInfo->IpAddressList);0 S k: i$ T3 n0 o9 T! i( C
do 1 y9 p [! V- F2 v1 X
{ h4 r6 ?- u. m% ?) q0 X$ w
cout<<pIpAddrString->IpAddress.String<<endl;# k. q/ }- |4 g. E' S" N: N @) j; ?3 N
pIpAddrString=pIpAddrString->Next;
G2 D0 {! c# d+ X6 x } while (pIpAddrString);" }9 h T; y0 q. Y( r% ~
pIpAdapterInfo = pIpAdapterInfo->Next;" t# i- C8 ?1 x n1 x5 P
cout<<"*****************************************************"<<endl;
1 r3 B3 y2 F; K. L, t% z9 e( v }
- b: [* S, i( d( ~( t return;, s4 F7 F2 c; S. l1 L0 j- n
}& [8 n2 e h' V- S' K
|
|