How to measure a Website Bandwidth (Upload+Download) in MB using C#/VB.Net programmatically?
Asked Answered
B

1

10

Hope that everybody is fine here.

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.

Target Platforms include only Windows Server 2003, 2003 R2, 2008 and 2008 R2.

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

  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.

Regards

Steve

Bullroarer answered 1/6, 2010 at 10:6 Comment(0)
S
11

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:

"In" Bandwith usage in % = (((ifInOctets(t2)-ifInOctets(t1)) * 8)*100) / (ifSpeed * (t2-t1))

Here is a sample code.

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;
      }
    }
  }
}

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


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.

Sweltering answered 17/3, 2011 at 19:51 Comment(2)
I did the same thing with Perl few months ago and it works like a charm, however the sleep time needs to be higher, otherwise you will always get zero values. If you want more precise values you can go for WMI or, even better, NFDump. Since you're working with Windows Server clients I'll definitely go for WMI.Oram
@RogerEdward It was working 9 years ago, one of my first answer on SO ;o) . The site does not respond I edit my answer to put the gitHub link, you can use the Nuget package.Sweltering

© 2022 - 2024 — McMap. All rights reserved.