Jump to content


Check out our Community Blogs

Register and join over 40,000 other developers!


Recent Status Updates

View All Updates

Photo
- - - - -

How to create a Bandwidth Monitor

timer

  • Please log in to reply
47 replies to this topic

#1 Dren

Dren

    CC Addict

  • Just Joined
  • PipPipPipPipPip
  • 232 posts

Posted 12 September 2008 - 05:18 PM

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.52KB   4174 downloads

  • 6

#2 Xav

Xav

    CC Mentor

  • VIP Member
  • PipPipPipPipPipPipPipPip
  • 8356 posts

Posted 13 September 2008 - 11:51 AM

As promised, Mr. Dren, +rep!
  • 0
If you enjoy reading this discussion and are thinking about commenting, why not click here to register and start participating in under a minute?

#3 Dren

Dren

    CC Addict

  • Just Joined
  • PipPipPipPipPip
  • 232 posts

Posted 13 September 2008 - 12:03 PM

Thank you BRO :P So... U like this thread right? :P
  • 0

#4 Xav

Xav

    CC Mentor

  • VIP Member
  • PipPipPipPipPipPipPipPip
  • 8356 posts

Posted 13 September 2008 - 12:03 PM

I didn't even read it. :D
  • -1
If you enjoy reading this discussion and are thinking about commenting, why not click here to register and start participating in under a minute?

#5 Dren

Dren

    CC Addict

  • Just Joined
  • PipPipPipPipPip
  • 232 posts

Posted 13 September 2008 - 12:08 PM

looooool It's not worth it, trust me lol :P
  • 2

#6 Xav

Xav

    CC Mentor

  • VIP Member
  • PipPipPipPipPipPipPipPip
  • 8356 posts

Posted 13 September 2008 - 12:09 PM

I saw the title and groaned. :P
  • 0
If you enjoy reading this discussion and are thinking about commenting, why not click here to register and start participating in under a minute?

#7 Dren

Dren

    CC Addict

  • Just Joined
  • PipPipPipPipPip
  • 232 posts

Posted 13 September 2008 - 12:22 PM

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
  • 0

#8 Xav

Xav

    CC Mentor

  • VIP Member
  • PipPipPipPipPipPipPipPip
  • 8356 posts

Posted 13 September 2008 - 12:28 PM

Good idea!
  • 0
If you enjoy reading this discussion and are thinking about commenting, why not click here to register and start participating in under a minute?

#9 amrosama

amrosama

    CC Mentor

  • VIP Member
  • PipPipPipPipPipPipPipPip
  • 2765 posts

Posted 13 September 2008 - 07:45 PM

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
  • 1

#10 Dren

Dren

    CC Addict

  • Just Joined
  • PipPipPipPipPip
  • 232 posts

Posted 14 September 2008 - 12:50 AM

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 :$
  • 0

#11 amrosama

amrosama

    CC Mentor

  • VIP Member
  • PipPipPipPipPipPipPipPip
  • 2765 posts

Posted 14 September 2008 - 02:25 AM

Posted via CodeCall Mobile
sure ill when i get home :)
  • 0

#12 thecobra

thecobra

    CC Lurker

  • Just Joined
  • Pip
  • 2 posts

Posted 14 September 2008 - 06:34 AM

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 :)
  • 0





Also tagged with one or more of these keywords: timer

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download