|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
% N+ Q" \; W( l3 l) y
1 a3 t9 o% y+ _. h" }4 q8 {5 l6 @, e. j1 P: p4 \
// 头文件包含
, \6 }0 D1 ^" p6 ~8 N, A N#include "stdafx.h"& T4 Q( d ?! A) C
#include <WinSock2.h>
9 }( h! X6 ^- s/ j* q8 U1 d#include <Iphlpapi.h>( O: f! |) A4 C; m, e9 ^& B+ G3 G# @
#include <iostream>3 L. N" e* T) o' k* g
using namespace std;: R; A* R& B% ?( ?; w2 G1 J
// 函数声明# Q$ q3 I' C' M j
void output(PIP_ADAPTER_INFO pIpAdapterInfo);
4 d6 L# a1 C3 i' i// 程序入口& N6 p! |7 A% l
int _tmain(int argc, _TCHAR* argv[])2 y2 {, }- K* e V: _5 h$ T$ q7 t1 k
{
3 z9 o# [1 B! }1 f* t2 J5 j //PIP_ADAPTER_INFO结构体指针存储本机网卡信息
3 T4 U, y6 s! ^! y# x% J# t PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO();
; \3 P5 I E: K9 M9 p //得到结构体大小,用于GetAdaptersInfo参数
9 Q9 {6 C& G* E0 _+ ~ unsigned long stSize = sizeof(IP_ADAPTER_INFO);% E0 x6 |5 w w# p0 g$ L/ v3 J, I
//调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量;其中stSize参数既是一个输入量也是一个输出量: ^$ z$ `7 h0 x3 |8 T% i
int nRel = GetAdaptersInfo(pIpAdapterInfo,&stSize);/ |$ s& d ]" g. q S/ z1 U# H6 K) z
if (ERROR_BUFFER_OVERFLOW==nRel)5 D; T, p9 e. L' x" U {: D# P
{" \9 M9 n5 ]( E7 ~ }6 x' T
//如果函数返回的是ERROR_BUFFER_OVERFLOW) n5 U1 X- R9 J4 ~; a1 N g
//则说明GetAdaptersInfo参数传递的内存空间不够,同时其传出stSize,表示需要的空间大小# S) @) _2 a$ R; U. q7 P) O `
//这也是说明为什么stSize既是一个输入量也是一个输出量
" r% S( S9 d N" K/ g //释放原来的内存空间
3 m" P0 [, X, O) @( m z3 f$ C: p delete pIpAdapterInfo;
% H5 {9 R6 |8 B. A2 j //重新申请内存空间用来存储所有网卡信息% n. ?0 V/ ]) n1 ~9 z9 M
pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize]; a) {( a m+ P2 F! @, H
//再次调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量4 k8 B9 _! c& d3 |+ Z$ W
nRel=GetAdaptersInfo(pIpAdapterInfo,&stSize); ' P6 T) H$ w" `: D5 H& {3 k' y& v
}! g3 b8 u( r- ?# M
if (ERROR_SUCCESS==nRel)
7 h8 _+ ~# S' s+ ?+ V/ \( s" E- p- E {; s" K+ q) H( @7 {' t7 X
//输出网卡信息
( M# B5 o c0 s8 K; L1 S$ Y0 _! X output(pIpAdapterInfo);6 t6 b9 P u, t
}2 b8 Z+ Y2 z; `' k
//释放内存空间
9 U7 a- I, }; @2 W if (pIpAdapterInfo)" ^: m; G- Z' T
{
& J8 L* i2 V* {! [ A delete pIpAdapterInfo;
' d- S1 k4 b p$ i% p5 y }% ^" i4 }1 o8 q
getchar();
* o9 R1 e& `& [0 l0 M1 w/ h' H! A return 0;
' J! c. o$ E: @& i7 y, _}
8 o' o) ~& C" Z" m+ ?4 z///函数作用,输出网卡信息
0 E2 C% ~. V8 |7 t$ P! b' Xvoid output(PIP_ADAPTER_INFO pIpAdapterInfo)7 f* j7 e9 d" h# z) W
{& ]7 k+ [( t* p: o; c4 \. V! I$ V
//可能有多网卡,因此通过循环去判断
9 P$ [# \2 y6 M- k) @3 u0 l! T% B while (pIpAdapterInfo)
: Q* ?! X$ U& P {
. ~$ M5 a8 f( I cout<<"网卡名称:"<<pIpAdapterInfo->AdapterName<<endl;
N. M* I d: I: ~% R! s cout<<"网卡描述:"<<pIpAdapterInfo->Description<<endl;
$ U D1 |6 j& ~' E" f% \& q. J cout<<"网卡MAC地址:"<<pIpAdapterInfo->Address;( ] A/ [- j- t' f9 x! f' V
for (UINT i = 0; i < pIpAdapterInfo->AddressLength; i++)0 G8 [4 T# C: i/ E7 m
if (i==pIpAdapterInfo->AddressLength-1)7 j& ]) K2 \( |* @; d L7 q4 Q
{
3 v3 v% [8 S! K5 U' z printf("%02x\n", pIpAdapterInfo->Address);
3 ^9 i% o. U0 P( a, t, R' @ }
' O: _! H( C: z9 P0 S7 } else
$ m# {4 p' r( u5 G% l {
6 I; v- s" `) y printf("%02x-", pIpAdapterInfo->Address);
& U6 ~1 L2 `& u4 h4 v/ P- d }
- a9 O+ L; }0 w: r' X cout<<"网卡IP地址如下:"<<endl;5 Y. x8 ^4 L6 ? o$ |& E3 I1 o+ }
//可能网卡有多IP,因此通过循环去判断& Q) v4 j. ]7 ^' c9 F
IP_ADDR_STRING *pIpAddrString =&(pIpAdapterInfo->IpAddressList);
* i0 h; G# W- @# C9 r d5 |) H do
6 v0 g2 h6 O3 ?; P6 Y {
, I: P8 O3 P, X2 ] cout<<pIpAddrString->IpAddress.String<<endl;
" q* T. V* N4 R4 e [ pIpAddrString=pIpAddrString->Next;8 H/ ]3 d$ r$ T! N- I/ K
} while (pIpAddrString);5 a) M& N( B7 p
pIpAdapterInfo = pIpAdapterInfo->Next;
1 M( Q1 K. C e2 \$ c: [2 p cout<<"*****************************************************"<<endl;
0 l$ F4 `8 a. I7 k7 Y1 l; ? x }: _, ?' G3 \; A6 t; H' w5 K- ]
return;# }* g; V9 n. j: X" f
}! @( V2 P o# j. P
|
|