|
|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
2 P3 l( F# ~3 Q# [1 {4 ]1 g' ?( ?
1 N3 L8 R7 w2 p0 _, l1 A8 l" b3 O S5 V1 X3 `6 K* i' Y% l
// 头文件包含# m4 z. f. b( K6 m @, Y& i
#include "stdafx.h"
0 ]5 c0 J3 b) N, F' O) N; L9 T! d#include <WinSock2.h>2 j9 t. k# D/ h9 f/ q1 ~7 }
#include <Iphlpapi.h>
! ~8 ^7 t. ]9 q9 f#include <iostream>
' d. y% U% V1 F: D7 lusing namespace std;
" `: t/ y0 j- s7 I2 ^. J4 m// 函数声明6 l; r: T! S/ O4 h: L4 J
void output(PIP_ADAPTER_INFO pIpAdapterInfo);' Z0 F! }) X% C3 _; g
// 程序入口; U3 T4 I- F9 ?; v$ |6 Y4 l
int _tmain(int argc, _TCHAR* argv[])
- g2 v4 a0 E9 l5 b+ ^+ H) b$ n& N{& b% t3 _9 Q2 Z' G& @: p
//PIP_ADAPTER_INFO结构体指针存储本机网卡信息
8 D6 S# g7 m! P, }0 p& G$ f" {4 |4 W' d PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO();4 e$ x, C5 O k+ \
//得到结构体大小,用于GetAdaptersInfo参数" A1 g5 ?8 t: F x6 G
unsigned long stSize = sizeof(IP_ADAPTER_INFO); X1 H3 r* L+ p2 N& Q* S
//调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量;其中stSize参数既是一个输入量也是一个输出量+ l* K& x: }6 L) |( U- s* Y+ @' ~
int nRel = GetAdaptersInfo(pIpAdapterInfo,&stSize);
9 A- d# _4 q/ [8 G0 N if (ERROR_BUFFER_OVERFLOW==nRel)1 I/ Y# Q( P; r8 ^ O4 v& {; K! Q3 j
{4 u3 J& X1 Z7 V( x$ N/ r/ ^% s
//如果函数返回的是ERROR_BUFFER_OVERFLOW
+ \) f" b2 w8 ` //则说明GetAdaptersInfo参数传递的内存空间不够,同时其传出stSize,表示需要的空间大小
) [/ r% w! \, V& e //这也是说明为什么stSize既是一个输入量也是一个输出量/ o/ w# n. m' M" K
//释放原来的内存空间
! ]2 K/ R' Z+ }8 Z3 d- R0 V2 w. P delete pIpAdapterInfo;3 F6 h6 _ |# S: w8 B- y' z K
//重新申请内存空间用来存储所有网卡信息
3 N' R$ P+ _, ?1 K6 ]5 q pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize];
* t# {/ y( _# O/ L1 M3 A. ^ B5 J //再次调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量
D j+ z, j3 ], V2 W# Y nRel=GetAdaptersInfo(pIpAdapterInfo,&stSize);
' g' B# \5 u$ y0 t$ H5 Z4 V1 F }
6 E$ b r! Z8 G8 V" K if (ERROR_SUCCESS==nRel)4 X" e4 @3 ^7 t5 ]( S6 d3 `
{
' k/ |6 D& R4 S' l& E //输出网卡信息% V4 c3 _& R' t# d0 ?2 f9 y
output(pIpAdapterInfo);
& {* _, h8 H' A7 N3 z) ? }6 R5 p, e; J/ r4 W3 u" z3 l% M
//释放内存空间1 F/ a9 `1 f4 q/ x- s
if (pIpAdapterInfo)
9 _9 b5 _+ U, K- d; F4 l7 h {) J P8 {1 Y! `& b1 Y
delete pIpAdapterInfo;- @; Q& n; Q0 o. @7 U" b
}
& Q- c# B9 W( h, e; y getchar();
' P* E$ B0 I; g. P return 0;
& K$ \) K8 u4 [2 M}/ A! R! ^2 L! T) M: `2 g1 ]+ S
///函数作用,输出网卡信息7 y9 y2 B, m* q- p& \. g
void output(PIP_ADAPTER_INFO pIpAdapterInfo)* H( `# Z' {/ f3 y. a
{3 ?" _% |4 q5 J3 V: I
//可能有多网卡,因此通过循环去判断5 {# ^" b' R9 ~+ [3 q8 A# q& @+ f* X
while (pIpAdapterInfo). u8 Z: I1 t' |- f0 k
{
8 z8 p2 T% J" T8 a3 R cout<<"网卡名称:"<<pIpAdapterInfo->AdapterName<<endl;- p- w* i* w3 U2 [) ?1 v/ U
cout<<"网卡描述:"<<pIpAdapterInfo->Description<<endl;$ f- _1 ^1 h# _
cout<<"网卡MAC地址:"<<pIpAdapterInfo->Address;
3 O" }- s& `( F* S( @+ D6 A2 s for (UINT i = 0; i < pIpAdapterInfo->AddressLength; i++)8 s, x' r4 c u- o0 S: `& W
if (i==pIpAdapterInfo->AddressLength-1)
. b) m, i+ b" Y {
8 o5 |) r" K0 w printf("%02x\n", pIpAdapterInfo->Address);
* [; w! m5 \6 V$ m }
* E; j1 @% `7 g4 k else
: d7 ^- C1 _7 R2 W# K& P {
4 g$ w$ K6 g$ _9 x! W# e! o printf("%02x-", pIpAdapterInfo->Address);8 R8 H/ D+ M% X6 w3 q1 R
}2 Z8 M O' z! `, H% b
cout<<"网卡IP地址如下:"<<endl;4 @& H m+ Z* L! K( H' K: U
//可能网卡有多IP,因此通过循环去判断# B2 c( p% D/ T1 a, y; K7 U7 m+ A
IP_ADDR_STRING *pIpAddrString =&(pIpAdapterInfo->IpAddressList);3 L7 r- C$ L1 T: S5 e
do ' u0 {. }3 w/ u& G$ k1 n/ X
{
, B. y8 o: ], ?) q& A cout<<pIpAddrString->IpAddress.String<<endl;3 F+ U9 O2 P. N- _9 [
pIpAddrString=pIpAddrString->Next;2 G1 s% e, r: s3 r5 W
} while (pIpAddrString);
, P2 ]' ] D2 L9 O+ t9 H# L- l) ~( @4 O4 x pIpAdapterInfo = pIpAdapterInfo->Next;( R; g$ ~0 j. q% Y
cout<<"*****************************************************"<<endl;+ D# c# ~- x" q; y* Y Y' u% j. d/ J( A( n
}
+ y% y/ @4 | ^& ?, o return;3 T7 z/ c! J! n
}
6 Z& ~+ M% i5 Q! O! d |
|