如何以编程方式使用 C#/VB.Net 以 MB 为单位测量网站带宽(上传+下载)? [英] How to measure a Website Bandwidth (Upload+Download) in MB using C#/VB.Net programmatically?

查看:32
本文介绍了如何以编程方式使用 C#/VB.Net 以 MB 为单位测量网站带宽(上传+下载)?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

希望这里的每个人都很好.

Hope that everybody is fine here.

我正在用 C#/VB.Net 编写一个 windows 服务,旨在测量 localhost 上所有网站的带宽消耗 并将他们的上传、下载等统计信息存储在本地/远程数据库中.

I am writing a windows service in C#/VB.Net that aims at measuring bandwidth consumption for all WebSites on localhost and store their statistics for upload , download etc on local/remote database.

目标平台仅包括 Windows Server 2003、2003 R2、2008 和 2008 R2.

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

I have searched a bit on this thing and found the following:

  1. 使用 Windows 2003 中的 SNMP mgmtapi.dll
  2. 使用自定义网络驱动程序来收集统计信息.
  1. Using SNMP mgmtapi.dll which is found in Windows 2003
  2. Using a custom Network Driver to collect statistics.

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

Please guide on the most appropriate ,secure and effective methodology/technique or set of such techniques which can be used to measure the bandwidth consumption for each different website.

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

Please also share any code in this regard.

问候

史蒂夫

推荐答案

我发现了一个名为 snmpsharpnet 在 .NET 上使用 SNMP 非常有帮助.

I found An assembly called snmpsharpnet wich is very helpful to play with SNMP on the top of .NET.

根据我在这篇文章 输入带宽使用率可以通过给定接口计算:

According to the explanation I wrote in this article the rate of input bandwith usage can be computed by for agiven interface:

输入"带宽使用百分比 = ((((ifInOctets(t2)-ifInOctets(t1)) * 8)*100)/(ifSpeed * (t2-t1))

"In" Bandwith usage in % = (((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 和一个计时器.

This is just au proof of concept, now you probably need to incoparate a BackgroundWorker and a timer.

如果您不确定 SNMP 是否可在服务器上连接,并且您想测试 SNMP 端口连接,您将需要 Microsoft PortQry.此工具确定端口是否正在侦听.此工具还提供其他功能,具体取决于您使用的命令.

If you are not sure if SNMP is joignable on the server and you want to test the SNMP port connection, you will need Microsoft PortQry. This tool determines if the port is listening. This tool also provides additional functionality, depending on the command you use.

这篇关于如何以编程方式使用 C#/VB.Net 以 MB 为单位测量网站带宽(上传+下载)?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆