Click here to Skip to main content
Licence GPL3
First Posted 29 Feb 2004
Views 189,484
Downloads 8,146
Bookmarked 138 times

Monitoring network speed

By Echevil | 29 Feb 2004
Detecting upload and download speed of a network adapter using performance counters.
2 votes, 6.5%
1
1 vote, 3.2%
2
3 votes, 9.7%
3
5 votes, 16.1%
4
20 votes, 64.5%
5
4.58/5 - 31 votes
2 removed
μ 4.07, σa 2.08 [?]

Sample Image

Introduction

The .NET Class Library provides a set of performance counters that you can use to track the performance both of the system and of an application. This program makes use of counters in the Networking category to obtain information about data sent and received over the network, and calculates network speed.

Using the code

This library includes only two classes, NetworkMonitor and NetworkAdapter. The former one provides general methods to enumerate network adapters installed on a computer, start or stop watching specified adapter, and a timer to read performance counter samples every second, and the latter represents a specific network adapter, providing properties presenting current speed.

The following code is a simple example of using these two classes:

    NetworkMonitor monitor    =    new NetworkMonitor();
    NetworkAdapter[] adapters    =    monitor.Adapters;

    // If the length of adapters is zero, then no instance
    // exists in the networking category of performance console.
    if (adapters.Length == 0)
    {
        Console.WriteLine("No network adapters found on this computer.");
        return;
    }

    // Start a timer to obtain new performance counter sample every second.
    monitor.StartMonitoring();

    for( int i = 0; i < 10; i ++)
    {
        foreach(NetworkAdapter adapter in adapters)
        {
            // The Name property denotes the name of this adapter.
            Console.WriteLine(adapter.Name);
            // The DownloadSpeedKbps and UploadSpeedKbps are
            // double values. You can also use properties DownloadSpeed
            // and UploadSpeed, which are long values but
            // are measured in bytes per second.
            Console.WriteLine(String.Format("dl: {0:n} " + 
               "kbps\t\tul: {1:n} kbps? adapter.DownloadSpeedKbps, 
               adapter.UploadSpeedKbps));
        }
        System.Threading.Thread.Sleep(1000); // Sleeps for one second.
    }

    // Stop the timer. Properties of adapter become invalid.
    monitor.StopMonitoring ();

Points of Interest

To enumerate the network adapters on a computer, I only utilize the existing interface names in the networking category of performance console. Here is the EnumerateNetworkAdapters() method.

    /// <summary>
    /// Enumerates network adapters installed on the computer.
    /// </summary>
    private void EnumerateNetworkAdapters()
    {
        PerformanceCounterCategory category    = 
          new PerformanceCounterCategory("Network Interface");

        foreach (string name in category.GetInstanceNames())
        {
            // This one exists on every computer.
            if (name == "MS TCP Loopback interface")
                continue;
            // Create an instance of NetworkAdapter class,
            // and create performance counters for it.
            NetworkAdapter adapter = new NetworkAdapter(name);
            adapter.dlCounter = new PerformanceCounter("Network Interface", 
                                                "Bytes Received/sec", name);
            adapter.ulCounter = new PerformanceCounter("Network Interface", 
                                                    "Bytes Sent/sec", name);
            this.adapters.Add(adapter);    // Add it to ArrayList adapter
        }
    }

A tricky problem with this approach is that an instance called “MS TCP Loopback interface” exists on every computer, of which both the download speed and the upload speed are always zero. So I explicitly check and exclude it in the program, which is certainly not a good manner but workable.

Before all of this, I tried to accomplish this by making a WMI query, which looked more decent, and my first version went like this:

    /// 
    /// Enumerates network adapters installed on the computer.
    /// 
    private void EnumerateNetworkAdapters()
    {
        // Information about network adapters can be found
        // by querying the WMI class Win32_NetworkAdapter,
        // NetConnectionStatus = 2 filters the ones that are not connected.
        // WMI related classes are located in assembly System.Management.dll
        ManagementObjectSearcher searcher = new 
            ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapter" + 
                                            " WHERE NetConnectionStatus=2");

        ManagementObjectCollection adapterObjects = searcher.Get();

        foreach (ManagementObject adapterObject in adapterObjects)
        {
            string name    =    adapterObject["Name"];

            // Create an instance of NetworkAdapter class,
            // and create performance counters for it.
            NetworkAdapter adapter = new NetworkAdapter(name);
            adapter.dlCounter = new PerformanceCounter("Network Interface", 
                                                "Bytes Received/sec", name);
            adapter.ulCounter = new PerformanceCounter("Network Interface", 
                                                    "Bytes Sent/sec", name);
            this.adapters.Add(adapter); // Add it to ArrayList adapter
        }
    }

The only problem is that the name of an adapter obtained this way will possibly differ from the instance name needed to create a performance counter. On my machine, this name is "Intel(R) PRO/100 VE Network Connection" querying WMI, and "Intel[R] Pro_100 VE Network Connection" in the performance console. I did not find a better solution and finally gave up WMI.

License

This article, along with any associated source code and files, is licensed under The GNU General Public License (GPLv3)

About the Author

Echevil

Software Developer
Autodesk
Singapore Singapore

Member

Follow on Twitter Follow on Twitter


Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board. (secure sign-in)
 
Search this forum  
 FAQ
    Noise  Layout  Per page   
  Refresh
QuestionWhat about Wireless networkcards? PinmemberLasse Rasch3:50 9 Dec '06  
AnswerRe: What about Wireless networkcards? PinmemberEchevil2:18 10 Dec '06  
Questionwild card? Pinmembercrazytri12:25 6 Dec '06  
Questionwhat about of connection measurment with ASP.NET Pinmembergeo-geo3:38 2 Nov '06  
Generalthank you very much Pinmemberosamahamed12323:35 3 Mar '06  
GeneralMonitoring Network Speed - WMI PinmemberkoenV3:31 22 Feb '06  
GeneralRe: Monitoring Network Speed - WMI Pinmemberwojwal2:00 5 Jan '07  
Well I'm trying to get into this also... And as my results confirms that only Win32_NetworkAdapterConfiguration - description field match there is more chars to replace. For example: '#' into '_':
 
WMI --> Karta Realtek RTL8139 Family PCI Fast Ethernet NIC #2
PerformanceCounter --> Karta Realtek RTL8139 Family PCI Fast Ethernet NIC _2
 
And there can be more special chars like (#,$,% ....) that changes into '_'...
 
I sbd will seek for solution let me only say that:
Win32_NetworkAdapterConfiguration - Caption - doesnt match at all
and
Win32_NetworkAdapter - Caption,Description,Name - also doesnt match at all
 

 
Wojciech Walek
QuestionWhat About win98? PinmemberNassosReyzidis1:10 1 Jun '05  
AnswerRe: What About win98? PinmemberEchevil (Pang Chen)23:38 2 Nov '05  
GeneralRe: What About win98? PinmemberBikash Rai22:50 20 Dec '05  
GeneralRe: What About win98? PinmemberEchevil23:30 20 Dec '05  
QuestionRe: What About win98? Pinmemberkpkrind19:50 15 Jan '06  
GeneralNice ! PinmemberElNoNo9:42 9 Nov '04  
GeneralGetInstanceNames calls hangs Pinsussfragnani1:59 9 Jun '04  
GeneralSystem.InvalidOperationException Pinmembermme517:05 9 May '04  
GeneralRe: System.InvalidOperationException PinmemberandrewPP4:57 20 Sep '04  
GeneralRe: System.InvalidOperationException PinmemberEchevil (Pang Chen)5:41 20 Sep '04  
GeneralRe: System.InvalidOperationException Pinmembermme521:25 27 Oct '04  
GeneralRe: System.InvalidOperationException PinmemberEchevil (Pang Chen)0:01 28 Oct '04  
General.DLL and Echevil PinmemberBern_0001:22 9 Mar '04  
GeneralRe: .DLL and Echevil PinmemberEchevil (Pang Chen)6:10 9 Mar '04  
GeneralRe: .DLL and Echevil PinmemberBern_0006:33 9 Mar '04  
GeneralRe: .DLL and Echevil Pinmemberxiaok1:44 3 Apr '04  
GeneralRe: .DLL and Echevil PinmemberEchevil (Pang Chen)7:15 4 Apr '04  

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Mobile
Web02 | 2.5.120210.1 | Last Updated 1 Mar 2004
Article Copyright 2004 by Echevil
Everything else Copyright © CodeProject, 1999-2012
Terms of Use
Layout: fixed | fluid