|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
+ B7 T6 _0 I' `% o) W; ]0 C1 b, \% B+ d
6 y" y- L' m; {# @3 I n
// 头文件包含
$ q. I7 \$ e. M; \6 h#include "stdafx.h"9 ^9 p) h8 b: N
#include <WinSock2.h>) }9 N+ }9 b& H5 }# n0 h
#include <Iphlpapi.h>
5 m9 y8 X2 ~8 e" D1 E#include <iostream>
; ? W' V; _% x, y% Fusing namespace std;
' O" l% i4 v. `' |1 l// 函数声明9 E$ a( F* @6 U8 k9 |; V+ `% K6 P
void output(PIP_ADAPTER_INFO pIpAdapterInfo);
# m5 z, ?! U9 H- Y5 C4 S2 ]$ t6 t// 程序入口
( Z4 ~4 ^& P8 v: j$ q+ Qint _tmain(int argc, _TCHAR* argv[])$ @# k s3 s4 X. ?. ~) c1 P1 ~
{ ?) I8 G! t' q, R( E
//PIP_ADAPTER_INFO结构体指针存储本机网卡信息0 y/ M9 F0 n+ i0 ~3 D) a
PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO();$ R9 C* ~1 Y; v
//得到结构体大小,用于GetAdaptersInfo参数
$ l/ R: ]* Y3 s unsigned long stSize = sizeof(IP_ADAPTER_INFO);7 @: F8 g: _- _# h
//调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量;其中stSize参数既是一个输入量也是一个输出量0 w0 G3 Z- b7 |7 D8 l
int nRel = GetAdaptersInfo(pIpAdapterInfo,&stSize);% i, a+ O5 N* ?7 M4 m
if (ERROR_BUFFER_OVERFLOW==nRel)
; I5 E9 v4 L& A9 p2 G {
: B, W6 p/ }4 ~+ D6 u7 @- [* b //如果函数返回的是ERROR_BUFFER_OVERFLOW
5 y! d/ E1 T2 c' h //则说明GetAdaptersInfo参数传递的内存空间不够,同时其传出stSize,表示需要的空间大小" W5 o: k1 a7 Z3 f5 k" g- X2 Q
//这也是说明为什么stSize既是一个输入量也是一个输出量3 b, I9 Q7 G" H6 \
//释放原来的内存空间2 x4 h6 G4 L/ G% Z9 r) J
delete pIpAdapterInfo;
+ m; {7 m# s1 ^' W$ g //重新申请内存空间用来存储所有网卡信息
5 z$ Q! {, a0 d9 M2 r pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize];# `# q8 u" l2 v. [4 ]/ _& B
//再次调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量
0 f, d3 o; [+ Y; R% C, I nRel=GetAdaptersInfo(pIpAdapterInfo,&stSize); 5 ~0 A% {" q; P4 [7 q
} n& O' H9 ~- v- F3 w" k+ a9 ]
if (ERROR_SUCCESS==nRel)" c! f* X9 r3 b. A- u# W* L
{2 C' M' o8 z! p, E8 z5 }8 w9 y& L3 F
//输出网卡信息9 A8 M9 A. ]( b/ I d) X
output(pIpAdapterInfo);
7 l: d" V; n4 r3 }8 R }: m' z) W+ D9 ^0 h* Y- \) ]
//释放内存空间- k% h/ ?, }5 U, `" S+ P
if (pIpAdapterInfo)
" W0 T+ p X' K+ O- d {& c! |) R$ {; K& @) N B. o, J. U! T
delete pIpAdapterInfo;
( x9 c" T" c' N }
* d" X& h8 A+ J8 D6 a/ h4 E getchar();
, m" l8 l+ F1 E. P1 L; M5 u return 0;. k I& W2 Q' \) V
}4 K- }, W- u) G
///函数作用,输出网卡信息4 g" e* ^/ q' s& y/ B
void output(PIP_ADAPTER_INFO pIpAdapterInfo)
: K9 \) j2 n$ F! a; X2 O{3 r9 N% Q3 @1 t8 I
//可能有多网卡,因此通过循环去判断3 c' M& a" @, U. v; E" g8 k- n
while (pIpAdapterInfo)
3 z$ i3 V$ c; C6 q6 W5 w8 Y {
3 \4 w ?* j Q cout<<"网卡名称:"<<pIpAdapterInfo->AdapterName<<endl;
) L1 \5 L' \, i* H$ P9 i: h6 m cout<<"网卡描述:"<<pIpAdapterInfo->Description<<endl;
+ a6 s" a2 X9 e* W cout<<"网卡MAC地址:"<<pIpAdapterInfo->Address;
1 x% e: s% n3 a# g3 m for (UINT i = 0; i < pIpAdapterInfo->AddressLength; i++)
; X8 N0 s5 B9 [/ B. E1 H if (i==pIpAdapterInfo->AddressLength-1)
: Q) A C, O2 c3 K: N# w {7 e( m: d1 J* N( E
printf("%02x\n", pIpAdapterInfo->Address);0 K1 I2 |1 Q" O
}% i+ v9 t! N" c; m: j6 ]. C
else& f" b' O7 u5 x
{( e5 `! P x2 _9 c& v9 m* p! g
printf("%02x-", pIpAdapterInfo->Address);
+ g2 f% v, J( o }
: H, _( e* c5 ] J4 ^( O% @ cout<<"网卡IP地址如下:"<<endl;
* F& Q. x& A) j& G- f //可能网卡有多IP,因此通过循环去判断 @/ Y2 h3 `" w1 |( c' j$ I
IP_ADDR_STRING *pIpAddrString =&(pIpAdapterInfo->IpAddressList);4 c! S. g7 @% j8 ?7 y) Y
do
" | g0 A% I, {& ~& d {
. f0 |6 r+ _4 T( ~" p5 m: h cout<<pIpAddrString->IpAddress.String<<endl;$ w% t5 @/ T# [1 q
pIpAddrString=pIpAddrString->Next;
: K; @2 {6 H8 ~; D$ ~! \ } while (pIpAddrString);
: l9 Y5 b, Z9 s9 Q9 [" I pIpAdapterInfo = pIpAdapterInfo->Next;
, }+ x" M; O8 P- _* w I# f& [ cout<<"*****************************************************"<<endl;
( i( ]/ z7 F4 A. C+ H }
$ l9 N+ [" g2 I" ^, O/ N6 o return;
1 }: `' ]! [7 W/ K- N; H}
0 W d0 U( x2 S$ s6 G |
|