|
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册
x
. \2 _/ H5 o1 X0 P
+ G; W! Y# \! c. c( |9 p- Z. G7 W* B. Z
// 头文件包含
+ ` l: h1 T% D. ]' c$ _) Z% M2 b#include "stdafx.h"
! i) S% o$ s4 J' } [1 l#include <WinSock2.h>
. q, S4 N: q, H' Z+ F2 t8 p0 `#include <Iphlpapi.h>
6 G: t5 Z* W4 Z#include <iostream>
0 T& ~, p+ L' \( A) ^; [using namespace std;
4 X U6 Y8 A) U1 E/ \. C// 函数声明* n9 q8 H+ \" h7 _& f* { ^) Y
void output(PIP_ADAPTER_INFO pIpAdapterInfo);
) k: L6 O( N! D4 q// 程序入口% C# k W" X2 B
int _tmain(int argc, _TCHAR* argv[])
# j O: l; B. [+ }, d7 P{
& l+ [' D" C% \; H H0 P+ w //PIP_ADAPTER_INFO结构体指针存储本机网卡信息
9 W! o1 d6 ]5 H4 b4 h PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO();+ K% o+ v3 N7 G9 K% I0 {& k7 T- ?
//得到结构体大小,用于GetAdaptersInfo参数
$ {5 k8 E1 ^6 b; k' X unsigned long stSize = sizeof(IP_ADAPTER_INFO);
) M( I" D& n6 T8 d& R _ //调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量;其中stSize参数既是一个输入量也是一个输出量
6 A; b& f5 U& ?! B int nRel = GetAdaptersInfo(pIpAdapterInfo,&stSize);
9 t- s* K6 j7 x% L5 C6 T8 @ if (ERROR_BUFFER_OVERFLOW==nRel)
0 N% ?0 X, N6 D6 m {( r/ e! w" d6 h% K$ b
//如果函数返回的是ERROR_BUFFER_OVERFLOW
* a Q3 M. o. L: J! E //则说明GetAdaptersInfo参数传递的内存空间不够,同时其传出stSize,表示需要的空间大小* |# S* d6 ?6 e8 f D7 ]3 E$ n
//这也是说明为什么stSize既是一个输入量也是一个输出量& [! a+ B( d& g% Z4 c* V7 B
//释放原来的内存空间
+ ^3 U& Q ~$ c delete pIpAdapterInfo;! W% M$ g) [$ e) @( ?
//重新申请内存空间用来存储所有网卡信息
/ T9 G. `$ k) i2 \( J* Q2 P( @ pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize];
( j% Z9 B0 o" W e ` //再次调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量
5 {1 x; N; B9 ~$ w2 \ nRel=GetAdaptersInfo(pIpAdapterInfo,&stSize);
4 F r6 b4 _& _4 i$ ~2 |) C& T6 J }
- b* @8 `" x3 k5 m! r4 O! T& N if (ERROR_SUCCESS==nRel)
0 l1 U7 U4 B+ q7 ?4 ^ {
4 ?: n7 j3 j! [' h, m" I //输出网卡信息! d/ J. y. G7 C9 Q+ O. `+ `, T
output(pIpAdapterInfo);) D8 \" I6 L0 Q8 B' m
}0 L9 W& c: n) {8 n, V
//释放内存空间
; B; I0 t6 U+ g if (pIpAdapterInfo)
+ i/ v. ?3 ^1 x* g& t6 N; O {
' V; y$ d& }) h0 E delete pIpAdapterInfo;
3 N7 i7 a4 C# G8 g }2 w* N. Y- g6 ]
getchar(); `# O0 b# o4 h8 t2 ?" n7 w
return 0;/ S: v1 t! Z" E
}
# f0 C9 E* ?$ j# S' F///函数作用,输出网卡信息
) W! y. E: Q" K" r& h# @void output(PIP_ADAPTER_INFO pIpAdapterInfo)
, Y+ m! Q7 O- K- q; A& w{
( H& i! x2 h0 t! P: q8 d4 G6 ? //可能有多网卡,因此通过循环去判断
8 L9 R! D. `3 @( m9 | while (pIpAdapterInfo)' D! d) }8 h6 p; v. L* Y
{
0 p& `* ?" H, I: v cout<<"网卡名称:"<<pIpAdapterInfo->AdapterName<<endl;/ q4 c# ^1 E J) z4 Y+ l; U6 N
cout<<"网卡描述:"<<pIpAdapterInfo->Description<<endl;# N( Q8 M; }5 Z% k5 Y6 H
cout<<"网卡MAC地址:"<<pIpAdapterInfo->Address;
: w+ v7 j4 W: v- E for (UINT i = 0; i < pIpAdapterInfo->AddressLength; i++)
) P4 B% L. ^2 {/ N { if (i==pIpAdapterInfo->AddressLength-1)
$ B/ a+ w' i% f, }- b {* x+ |# z! @: ]5 G* \
printf("%02x\n", pIpAdapterInfo->Address);' N) J+ l% P1 {* R4 u
}) v' n+ n$ c0 a4 D" j
else2 a! f$ h. b" [7 N3 i
{( w3 P! w- P ^* P
printf("%02x-", pIpAdapterInfo->Address);# }5 F" Y7 E2 F6 H8 q. P
}, \1 \1 ~3 R% x6 |/ v
cout<<"网卡IP地址如下:"<<endl;
: T( X- z9 [+ ~; F9 F$ Y //可能网卡有多IP,因此通过循环去判断; @5 d) R4 E$ x+ D7 _8 \$ q k" A
IP_ADDR_STRING *pIpAddrString =&(pIpAdapterInfo->IpAddressList);
9 T( x$ K; v' |, ^6 v* C5 Q y do
4 W. B3 Q# k$ L1 ]% l {
G0 L) `( i8 T! z- P4 _ cout<<pIpAddrString->IpAddress.String<<endl;
3 c2 X! j7 A! O pIpAddrString=pIpAddrString->Next;4 m( \+ d) [) v: g( N; x- L2 D. }
} while (pIpAddrString);( n" V* e9 O# I1 P* q4 h
pIpAdapterInfo = pIpAdapterInfo->Next;
. C% e) e: r- i# e" H, E: m cout<<"*****************************************************"<<endl;
9 n5 c! m- e- X5 @0 q/ o }
2 @( L) B, R2 j u" O' e+ [3 Y/ x return;( s- i2 c. r: G0 ~- L( |9 |
}' O) n% z4 G/ W) z4 g! q! w5 Y# w
|
|