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:
If you have any questions or suggestions please post them here.