Welcome

首页 / 软件开发 / .NET编程技术 / 获取网络使用率的方案(a better solution to get network utilization)

获取网络使用率的方案(a better solution to get network utilization)2010-12-29 博客园 moonz-wu这两天一直在研究如何去获取网络利用率(usage)和网卡线路速度(link speed)的问题,找到了一个比较好的方案,写出来跟大家分享一下。

记得我在以前的一篇博文中提到过这样一个问题,有时我们添加两个虚拟网卡时,两个网卡名称是一样的,这样的结果就是我们无法根据名称去匹配指定的网卡。

通常我们获取网卡的信息有两种方式:1. WMI的win32_networkAdapter类;2. IpHlpApi框架。

而获取网络使用率的方式也有两种:1. performance monitor编程接口;2. Win32_PerfFormattedData_Tcpip_NetworkInterface类。

但是我发现这些方式都没办法解决我以上提到的问题。因为无论是从performance monitor,还是Win32_PerfFormattedData_Tcpip_NetworkInterface来获取网络利用率都是依赖于网卡名。另外,我发现在Windows Task manager里面看的网络使用率和线路速度都匹配的很正常。所以,直觉是觉得应该有一种方式可以比较好的去获取这两个值,无论网卡名是否相同。通过研究发现,其实想要获取这两个值,并且建立匹配关系可以通过WMI和IpHlpApi框架来实现。顺便说一句,我的目标是该程序能运行在win2000以后的所有系统上,所以出于兼容性的考虑,我会放弃那些只支持vista之后操作系统的方案。下面我们具体来看一下,如何用代码来实现:

为了获得WMI和IpHlpApi框架的支持,我们需要包含下面几个头文件和库:

#include <Wbemidl.h>
#include <comdef.h>
#include <Iphlpapi.h>
#pragma comment(lib , "Iphlpapi.lib")

同样为了使用智能指针,我又做了以下声明

_COM_SMARTPTR_TYPEDEF(IWbemLocator, __uuidof(IWbemLocator));
_COM_SMARTPTR_TYPEDEF(IWbemServices, __uuidof(IWbemServices));
_COM_SMARTPTR_TYPEDEF(IEnumWbemClassObject, __uuidof(IEnumWbemClassObject));
_COM_SMARTPTR_TYPEDEF(IWbemClassObject, __uuidof(IWbemClassObject));

对于WMI的具体操作,我就不在这里多说了。最主要的是介绍一下我的实现方式。首先我们需要用WMI去查询获取网卡的一些必要的信息,如MAC地址,Interface Index和线路速度

先定义一个结构体来存储网卡与使用率的映射关系

typedef struct _tagNetworkUtilizationMapElement
{
wchar_t MAC[64];
unsigned int interfaceIndex;
unsigned __int64 linkSpeed;
DWORD preInBytes;
DWORD preOutBytes;
unsigned int usage;
}NetworkUtilization_Map_Element, *PNetworkUtilization_Map_Element;

之后通过一个WMI查询去获取MAC, InterfaceIndex和 linkSpeed。