如何以编程方式使用C#/ VB.Net以MB为单位测量网站带宽(上传+下载)?

希望大家都在这里好。

我正在C#/ VB.Net中编写一个Windows服务 ,旨在测量 localhost上所有WebSite的带宽消耗 ,并将其统计信息存储在本地/远程数据库上以上载,下载等。

目标平台仅包括Windows Server 2003,2003 R2,2008和2008 R2。

我在这件事上搜了一下,发现了以下内容:

  1. 使用Windows 2003中的SNMP mgmtapi.dll
  2. 使用自定义网络驱动程序收集统计信息。

请指导最合适,最安全有效的方法/技术或一组此类技术,这些技术可用于衡量每个不同网站的带宽消耗。

还请分享这方面的任何代码

问候

史蒂夫

我发现一个名为snmpsharpnet的程序集对于在.NET上运行SNMP非常有帮助。

根据我在本文中所写的解释,输入带宽使用率可以通过agiven接口计算:

“在”Bandwith中使用%=(((ifInOctets(t2)-ifInOctets(t1))* 8)* 100)/(ifSpeed *(t2-t1))

这是一个示例代码。

using System; using System.Collections.Generic; using System.Text; using SnmpSharpNet; namespace Exemple2 { class Program { static void Main(string[] args) { /* Get an SNMP Object */ SimpleSnmp snmpVerb = new SimpleSnmp("192.168.1.121", 161, "public"); if (!snmpVerb.Valid) { Console.WriteLine("Seems that IP or comunauty is not cool"); return; } /* Sample of simple Get usage on ifSpeed on interface 10 * TODO : for sure you have to detect the right interface */ Oid oidifSpeed = new Oid(".1.3.6.1.2.1.2.2.1.5.10"); /* Getting ifSpeed */ Dictionary snmpDataS = snmpVerb.Get(SnmpVersion.Ver2, new string[] { oidifSpeed.ToString() }); if (snmpDataS != null) Console.WriteLine("Interface speed \"{0}\" : {1}", oidifSpeed.ToString(), snmpDataS[oidifSpeed].ToString()); else Console.WriteLine("Not Glop!"); /* Sample of simple Get usage on ifInOctets on interface 10 * TODO : for sure you have to detect the right interface */ Oid oidifInOctets = new Oid(".1.3.6.1.2.1.2.2.1.10.10"); Dictionary snmpData1; /* Getting it for the first time */ snmpData1 = snmpVerb.Get(SnmpVersion.Ver2, new string[] { oidifInOctets.ToString() }); if (snmpData1 != null) Console.WriteLine("Number of In octets \"{0}\" : {1}", oidifInOctets.ToString(), snmpData1[oidifInOctets].ToString()); else Console.WriteLine("Not Glop!"); int missed = 0; while (true) { if (missed == 0) { /* When you detect a non refesh data, keep the last one */ snmpData1 = snmpVerb.Get(SnmpVersion.Ver2, new string[] { oidifInOctets.ToString() }); if (snmpData1 != null) Console.WriteLine("Number of In octets \"{0}\" : {1}", oidifInOctets.ToString(), snmpData1[oidifInOctets].ToString()); else Console.WriteLine("Not Glop!"); } /* Some Wait (less aproximative) */ int duration = 5; System.Threading.Thread.Sleep(duration*1000); // duration seconds /* Getting it for the Second time */ Dictionary snmpData2 = snmpVerb.Get(SnmpVersion.Ver2, new string[] { oidifInOctets.ToString() }); if (snmpData2 != null) Console.WriteLine("Number of In octets \"{0}\" : {1}", oidifInOctets.ToString(), snmpData2[oidifInOctets].ToString()); else Console.WriteLine("Not Glop!"); Counter32 I1 = new Counter32(); I1.Set(snmpData1[oidifInOctets]); Counter32 I2 = new Counter32(); I2.Set(snmpData2[oidifInOctets]); Counter32 speed = new Counter32(); speed.Set(snmpDataS[oidifSpeed]); if (I2.Value == I1.Value) { missed += 1; continue; } decimal bandWithUsage = (((decimal)(I2.Value - I1.Value) * 8) * 100) / (speed * duration * (1+missed)); Console.WriteLine("BandWith usage : {0}%", bandWithUsage); missed = 0; } } } } 

这只是概念validation,现在您可能需要安装BackgroundWorker和计时器。

我希望它有所帮助。

最好的祝福

J.P