2010-06-01 80 views
8

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

我在C#/ VB.Net,旨在本地主机测量带宽消耗所有网站和存储他们的统计数据上载写窗口服务,下载等本地/远程数据库。

目标平台只包括的Windows Server 2003,2003 R2,2008年和2008 R2。

我搜索过这件事了一下,发现以下几点:

  1. 使用SNMP MGMTAPI.DLL这是在Windows 2003
  2. 发现使用自定义的网络驱动收集统计信息。

上最合适的,安全的有效的方法/技术请指导或设定的可用于测量对于每个不同的网站上的带宽消耗这样的技术。

请在这方面也分享任何代码

问候

史蒂夫

回答

9

我发现了一个大会呼吁snmpsharpnet至极是非常有帮助的。NET的顶部,SNMP玩。

根据我在this article写的说明输入带宽的使用率可以通过用于agiven接口来计算:

“以” 在带宽%使用率=(((的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<Oid, AsnType> 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<Oid, AsnType> 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<Oid, AsnType> 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; 
     } 
    } 
    } 
} 

这只是概念验证,现在您可能需要更新BackgroundWorker和计时器。

我希望它有帮助。

问候

JP

+0

你的代码看起来很有希望!我会尝试一下并发布结果。 :) – 2011-03-18 08:51:32

+2

我几个月前用Perl做了同样的事情,它的工作原理就像一个魅力,但是睡眠时间需要更高,否则你总会得到零值。如果你想要更精确的值,你可以选择WMI或更好的NFDump。既然你正在使用Windows Server客户端,我一定会去WMI。 – raz3r 2012-03-23 10:25:03

+0

作品像一个魅力:)谢谢 – 2012-09-13 12:40:57

相关问题