获取网络使用率的方案(a better solution to get network utilization)

这两天一直在研究如何去获取网络利用率(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。

时间: 2024-09-08 08:26:17

获取网络使用率的方案(a better solution to get network utilization)的相关文章

DockOne微信分享(一二二):探索Kubernetes的网络原理及方案

本文讲的是DockOne微信分享(一二二):探索Kubernetes的网络原理及方案[编者的话]2016年ClusterHQ容器技术应用调查报告显示,一年来容器技术应用于生产的比例增长了96%,Kubernetes的使用率达到了40%,成为了最受欢迎的容器编排工具:那么Kubernetes到底是什么呢?它是一个用于容器集群的自动化部署.扩容以及运维的开源平台:那么通过Kubernetes能干什么呢?它能快速而有预期地部署你的应用,极速地扩展你的应用,无缝对接新的应用功能,节省资源,优化硬件资源的

YH中多方法获取网络时间

在做YH维护的时候,偶尔会碰到这样的问题:电脑的非正常关机导致系统时间出错(变为了2002-1-1),从而影响到项目系统的使用.尤其是设计到money的系统,如果时间错误,可能会导致无法想象的后果.所以我们可能需要用系统和网络的双重验证. 通过收集.修改.优化和测试,剔除了一些错误的和速度超慢的,只剩下了4种可行的方案.这些方案中主要有3类: 一.通过向某网站发送请求,获取服务器响应请求的时间 二.获某时间网页的html或xml码,读取其中的时间. 三.通过向某授时服务器发送请求,获取网络时间

多方法获取网络时间

       在做YH维护的时候,偶尔会碰到这样的问题:电脑的非正常关机导致系统时间出错(变为了2002-1-1),从而影响到项目系统的使用.尤其是设计到money的系统,如果时间错误,可能会导致无法想象的后果.所以我们可能需要用系统和网络的双重验证.          通过收集.修改.优化和测试,剔除了一些错误的和速度超慢的,只剩下了4种可行的方案.这些方案中主要有3类:           一.通过向某网站发送请求,获取服务器响应请求的时间           二.获某时间网页的html或x

Lua获取网络时间(获取时间同步服务器的时间)_Lua

网络授时服务是一些网络上的时间服务器提供的时间,一般用于本地时钟同步. 授时服务有很多种,一般我们选择RFC-868.这个协议的工作流程是:(S代表Server,C代表Client) S: 检测端口37 U: 连接到端口37 S: 以32位二进制数发送时间 U: 接收时间 U: 关闭连接 S: 关闭连接 协议非常简单,用TCP连接上后,服务器直接把时间发送回来.发送的是从1900年1月1日午夜到现在的秒数. 使用luasocket 实现的方案有很多种,Lua不一定是最简单的,选择只是出于个人兴趣

在C#中调用API获取网络信息和流量

流量|网络 最近一项目中要求显示网络流量,而且必须使用C#. 事实上,调用 IpHlpApi.dll 的 GetIfTable API 可以轻易获得网络信息和网络流量.只是要在C#中实现还是比较复杂. 先看看怎么定义该 API [DllImport("IpHlpApi.dll")]        extern static public uint GetIfTable(byte[] pIfTable, ref uint pdwSize, bool bOrder);本来想把 pIfTab

C#获取网络邻居所有工作组和机器名称

网络 using System;using System.Drawing;using System.Collections;using System.ComponentModel;using System.Windows.Forms;//查询网络上的计算机IP和用户需要引用using System.Data;using System.IO;using System.Net;using System.Net.Sockets;using System.Threading;//关键引用空间System

Windows 8 Store Apps学习(60) 通信: 获取网络信息, 序列化和反序列化

介绍 重新想象 Windows 8 Store Apps 之 通信 获取网络信息 序列化 - json 序列化 - xml 序列化 - rss atom 示例 1.演示如何获取网络的相关信息 Communication/NetworkInfo.xaml.cs /* * 演示如何获取网络的相关信息 */ using System; using System.Collections.Generic; using Windows.Networking.Connectivity; using Windo

公司内部区域网络升级可行性方案简介

下面是笔者前段时间写的公司某区域网络升级可行性方案. 一. 需求分析 随着公司业务的拓展及规模的扩大,原有网络已不能满足公司的发展需求,经过公司各部门多次协商与论证,领导层决定对原有网络的主干线路及设备进行一次大型的升级改造. 具体需求分析如下: (1).业务需求:作为一个独立的AS网络运营,拥有独立的自治区域AS号,拥有属于自己的公网IP地址等,可以实现独立的AS网络中可以运营的所有业务. (2).地址分配:为每一个用户动态与静态相结合的方式分配公网IP地址. (3).运营计费:实现多种计费验

Windows Phone 同步方式获取网络类型

在Windows Phone 开发中有时候需要获取设备当前连接网络的类型,是Wifi,还是2G,3G,或者4G,SDK中提供获取网络类型的API(Microsoft.Phone.Net.NetworkInformation. DeviceNetworkInformation),通过此API我们可以方便的获取相关信息.但是此API是基于异步回调的方式获取的,如果需要同步获取,那么就需要做一些特殊的处理. 以下代码定义网络类型信息类,用于存储获取的网络类型信息. /// <summary> ///