|
|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
+ _0 M* R& Y- E3 {9 R3 x1 F' T) Y& y
( }" F2 u5 w( K0 p0 D// 头文件包含0 N/ J5 G: p* s3 D9 D5 ?# W
#include "stdafx.h") f9 P0 b# l0 K/ n! I7 Q9 H+ w
#include <WinSock2.h>
: Y! ~2 F6 G7 I#include <Iphlpapi.h>
$ c( e4 j/ a1 L4 I/ M#include <iostream>
: a: W# p$ C* _- [9 `% [" ?using namespace std;) X- u3 ` w, d- R4 m c
// 函数声明 h. \* d* G; `9 z% B ~+ U
void output(PIP_ADAPTER_INFO pIpAdapterInfo);+ H$ a. g" ?9 d
// 程序入口, H- W0 @! x! Y6 i
int _tmain(int argc, _TCHAR* argv[])$ a* y9 ?5 o! M6 T, o
{5 b, G9 E- X" G8 F
//PIP_ADAPTER_INFO结构体指针存储本机网卡信息! ~, d7 G% R3 D+ Z
PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO();& X$ q- ?$ a% D' K s
//得到结构体大小,用于GetAdaptersInfo参数
. c1 d' d' X7 i$ l0 w0 J unsigned long stSize = sizeof(IP_ADAPTER_INFO);' W3 K' o6 Q9 T3 p$ O
//调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量;其中stSize参数既是一个输入量也是一个输出量* D% T2 c6 p. [& S- m
int nRel = GetAdaptersInfo(pIpAdapterInfo,&stSize);! g9 U$ ]& `9 f# T" `
if (ERROR_BUFFER_OVERFLOW==nRel)
* @2 Y! r* a0 _: M7 b( S/ j {
& ]: C/ B7 [1 M0 S/ Z( k //如果函数返回的是ERROR_BUFFER_OVERFLOW6 p' n+ g' M+ S' W" d; x8 m/ c
//则说明GetAdaptersInfo参数传递的内存空间不够,同时其传出stSize,表示需要的空间大小
' K. Z5 ] \* O4 g# W //这也是说明为什么stSize既是一个输入量也是一个输出量
% M4 [& w! j- X( a //释放原来的内存空间% j& y4 k3 c i4 h" l# C& Z
delete pIpAdapterInfo;# g9 e7 O) y4 M
//重新申请内存空间用来存储所有网卡信息
6 T2 u0 q/ C1 ?1 K9 [ pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize];
* B) w/ e9 r& x- d- X" f0 ?6 b4 s //再次调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量
/ Q$ m% u) u% w* j2 | nRel=GetAdaptersInfo(pIpAdapterInfo,&stSize); ( I7 n) K/ C' _+ k
}
% a6 _+ B1 H4 t# @) [ if (ERROR_SUCCESS==nRel)
+ q0 Y ^, Q6 F# I d5 Y$ n9 F7 t {( F8 R+ ^" G; c6 \. Y/ {
//输出网卡信息+ z: V& A4 ]* m% M: A
output(pIpAdapterInfo);
+ X- E! d" C8 i# W; i, V# s2 g }
3 b; @& Z8 d1 ^* u; w //释放内存空间: J) x( m$ P }& _4 S* E4 D" E' K
if (pIpAdapterInfo)+ ^- c5 p, N* R; B1 g
{
7 c; a( Y( Q2 ] delete pIpAdapterInfo;
( l9 \/ k5 R$ D5 F6 S# m }
2 R/ P5 H- Z2 ?- H) k getchar();% j8 O0 W7 v4 \
return 0;
: R. u( ~# T/ n& v# R* i}; S" p: ]8 s/ J1 W: w
///函数作用,输出网卡信息( M. L* C) Q3 ]: B7 v2 {
void output(PIP_ADAPTER_INFO pIpAdapterInfo)' k9 @' g9 {: L
{# O. d5 C: ]0 v
//可能有多网卡,因此通过循环去判断
5 a' ^2 g9 e; n3 P% ~) @2 _ while (pIpAdapterInfo)
1 S9 ]8 |/ y- x6 m' D: h" ?( r {
3 j- j" v( }- N cout<<"网卡名称:"<<pIpAdapterInfo->AdapterName<<endl;
' e" t! l6 [& B cout<<"网卡描述:"<<pIpAdapterInfo->Description<<endl;+ J0 G; z# Z- v7 q P) B" B8 e
cout<<"网卡MAC地址:"<<pIpAdapterInfo->Address;1 l# e1 t, P* N
for (UINT i = 0; i < pIpAdapterInfo->AddressLength; i++); E1 L' l; a: @% P. p: w
if (i==pIpAdapterInfo->AddressLength-1)& X9 y! N( c- d8 U. Q2 e" ^
{
- Q( T) h% Q7 y( l5 i printf("%02x\n", pIpAdapterInfo->Address);
% }4 Z: p4 n; Z1 T }
# M- c2 |/ H& o. r& p! e' w1 x else
% ]6 x. _, w, b0 S4 z# _4 a j! q {
; |# Z' y7 L' Q printf("%02x-", pIpAdapterInfo->Address);
! J" `$ @/ A4 U: p* J }
" Z: ^4 C; M$ x7 h cout<<"网卡IP地址如下:"<<endl;
* ~8 N/ C! v( ?4 ~. n9 Q //可能网卡有多IP,因此通过循环去判断
$ F7 p( t' c k/ r% ~% Y IP_ADDR_STRING *pIpAddrString =&(pIpAdapterInfo->IpAddressList);
) s! \; p; V8 \* i* B do
: ]. E4 v) M8 R. k3 ]7 {7 n) W9 a {1 Y% L* |0 l, r0 H+ @
cout<<pIpAddrString->IpAddress.String<<endl;$ B; v/ Y" C ]
pIpAddrString=pIpAddrString->Next;
3 W/ q! J& ?1 d) v% q% Y6 h7 M } while (pIpAddrString);! t4 ?6 L! T8 Z
pIpAdapterInfo = pIpAdapterInfo->Next;% Z; W- W2 q1 C0 U) ~4 J
cout<<"*****************************************************"<<endl;
6 U+ t7 R7 G2 S- P5 M }* D# y; C8 B/ E$ ]) r
return;
! y5 L* b, P1 ~ l3 c3 }( j, f}
% J, a+ Z& G3 T |
|