Jump to content

How to create a Bandwidth Monitor

- - - - -

  • Please log in to reply
47 replies to this topic

#1
Dren

Dren

    Programming Expert

  • Members
  • PipPipPipPipPipPip
  • 448 posts
As we know the bandwidth is measured in bits per second. A Bandwidth monitor is a kind of software which displays the upload and download rate and sometimes it shows the load on a graph too. And that’s what we are going to create today.

But HOW?
There is a Windows tool called netstat which displays network statistics, some of them needed by us now. If you run the command prompt and type netstst –e you will see how much you have downloaded and uploaded since you have started your PC.

But HOW ARE WE GOING TO CALCULATE THE BANDWIDTH?
Very simple! As we said bandwidth is measured in bits per second so every second we will discount the result we got 1 second ago to the new result so we will gt how much we have downloaded(or uploaded) for a second. We will make a timer do this every second.

Now HOW TO CODE IT?
For this tutorial I created a module that we will use to get the current download and upload amount.

First I have declared 2 public variables DLoad and ULoad. Both are declared as Long because they will hold large numbers. DLoad will hold the amount of downloaded stuff in bytes until now and ULoad the upload.

Then we have a function called GetLoadInfo() which will fill the variables above. In this function first we see 2 variables and this line:

Shell "cmd.exe /C netstat -e> " & Chr(34) & App.Path & "\Load.tmp" & Chr(34), vbHide

This means that netstat –e will be called and the results will be stored in the file Load.tmp in the application path.

After this line we have some other code:

On Error GoTo PassRead
Open App.Path & "\Load.tmp" For Input As #1

    Do Until EOF(1)
        Input #1, TempLoadStr
        LoadStr = LoadStr & TempLoadStr
    Loop

Close #1

The 2 variables will be used to read what is stored in the netstat’s results. After this, the results will get split. This is done in the next lines:

SString = Split(LoadStr, "Bytes")

DLoad = Int(Mid(SString(1), 14, 17))
ULoad = Int(Mid(SString(1), 31, 16))

We noticed the On Error GoTo PassRead line above. That will be used to pass the code exestuation if netstat hasn’t shown any results.

Now the whole module looks like this:

Public ULoad As Long
Public DLoad As Long

Public Sub GetLoadInfo()
Dim TempLoadStr As String
Dim LoadStr As String

Shell "cmd.exe /C netstat -e> " & Chr(34) & App.Path & "\Load.tmp" & Chr(34), vbHide

On Error GoTo PassRead
Open App.Path & "\Load.tmp" For Input As #1

    Do Until EOF(1)
        Input #1, TempLoadStr
        LoadStr = LoadStr & TempLoadStr
    Loop

Close #1

SString = Split(LoadStr, "Bytes")

DLoad = Int(Mid(SString(1), 14, 17))
ULoad = Int(Mid(SString(1), 31, 16))

PassRead:
End Sub 


Now we can create the form…

In the form first we declare 3 variables, LastULoad, LastDLoad, SeccondsPassed all of them as Long, then we create 2 labels, lblDC and lblUC (label Download Container and label Upload Container), we add a timer, we set the timer’s interval to 1000 milliseconds and add this code to the timer:

Private Sub Timer1_Timer()
Call GetLoadInfo

If SecondsPassed > 3 Then
    lblDC.Caption = Int((DLoad - LastDLoad) / 1000) * 8 & "kb/s"
    lblUC.Caption = Int((ULoad - LastULoad) / 1000) * 8 & "kb/s"
End If

SecondsPassed = SecondsPassed + 1

LastDLoad = DLoad
LastULoad = ULoad
End Sub

As we see, first we call the function from the module, then, we see a variable that needs to be 3 if we want to show the results. The reason is that we will need about 3 seconds to calibrate with the netstat’s results. If we wouldn’t do that, at first we would get extreme bandwidth results so we wait 3 seconds for calibration. Then we fill the labels. We see that the results are being multiplied and divided by some numbers. Dividing by 1000 means we don’t want to show the results in bytes, but in kilo bytes and multiplying by 8 means we want to see the results in bits, not bytes.

After this code we see that the LastDLoad and LastULoad variables are being filled with new values, getting ready for the next calculation.

This is all… If anything doesn’t work, download the attachment and find the errors. In the attachment the Bandwidth Meter is much advanced, it has graphs included to show the download and upload rates.

Here's a screenshot of CodeCall's Bandwidth Monitor included in the attachment:
Posted Image


If you have any questions or suggestions please post them here.

Best wishes,
Dren

Attached Files

  • Attached File  BMon.zip   3.52K   1422 downloads


#2
Xav

Xav

    Writes binary right handed and hex left handed

  • Members
  • PipPipPipPipPipPipPipPipPip
  • 13,118 posts
As promised, Mr. Dren, +rep!
Jordan said:

Good members, like yourself, stick around and post for ages to come!
Mr. Xav | Blog | Forums

#3
Dren

Dren

    Programming Expert

  • Members
  • PipPipPipPipPipPip
  • 448 posts
Thank you BRO :P So... U like this thread right? :P

#4
Xav

Xav

    Writes binary right handed and hex left handed

  • Members
  • PipPipPipPipPipPipPipPipPip
  • 13,118 posts
I didn't even read it. :D
Jordan said:

Good members, like yourself, stick around and post for ages to come!
Mr. Xav | Blog | Forums

#5
Dren

Dren

    Programming Expert

  • Members
  • PipPipPipPipPipPip
  • 448 posts
looooool It's not worth it, trust me lol :p

#6
Xav

Xav

    Writes binary right handed and hex left handed

  • Members
  • PipPipPipPipPipPipPipPipPip
  • 13,118 posts
I saw the title and groaned. :p
Jordan said:

Good members, like yourself, stick around and post for ages to come!
Mr. Xav | Blog | Forums

#7
Dren

Dren

    Programming Expert

  • Members
  • PipPipPipPipPipPip
  • 448 posts
I decided to create this tutorial because I usually check up Google if something like that exists. This didn't, so I know that if someone will search for something like this in Google it this will be displayed the first so we get more Users in CodeCall :D

#8
Xav

Xav

    Writes binary right handed and hex left handed

  • Members
  • PipPipPipPipPipPipPipPipPip
  • 13,118 posts
Good idea!
Jordan said:

Good members, like yourself, stick around and post for ages to come!
Mr. Xav | Blog | Forums

#9
amrosama

amrosama

    Writes binary right handed and hex left handed

  • Members
  • PipPipPipPipPipPipPipPipPip
  • 8,675 posts
Really nice thread
thnx dren, i always wanted to use dos commands in my app but i didnt know how to store results into variables
thnx again

#10
Dren

Dren

    Programming Expert

  • Members
  • PipPipPipPipPipPip
  • 448 posts

amrosama said:

Really nice thread
thnx dren, i always wanted to use dos commands in my app but i didnt know how to store results into variables
thnx again

Thank you amrosama! For what you need you can also use the DosOutputs class. Using that you can put your results directly in a variable without needing to write them in a file first. So, why not give me some +rep :$

#11
amrosama

amrosama

    Writes binary right handed and hex left handed

  • Members
  • PipPipPipPipPipPipPipPipPip
  • 8,675 posts
Posted via CodeCall Mobile
sure ill when i get home :)

#12
thecobra

thecobra

    Newbie

  • Members
  • Pip
  • 2 posts
nice thread, wow i impress on the stuff you can do with VB (i prefer c but vb is good for fast/ simple program gui maker) rep by me will come :)




1 user(s) are reading this topic

0 members, 1 guests, 0 anonymous users