Die Community zu .NET und Classic VB.
Menü

VB.NET-Tipp 0091: Netzwerkgeschwindigkeit und Transfervolumen erfassen

 von 

Beschreibung

Eine Klasse, mit der sich die Up- und Downloadgeschwindigkeit des Netzwerkadapters sowie das dabei transferierte Volumen erfassen lässt.

Schwierigkeitsgrad:

Schwierigkeitsgrad 2

Framework-Version(en):

.NET Framework 1.1, .NET Framework 2.0, .NET Framework 3.0, .NET Framework 3.5

.NET-Version(en):

Visual Basic 2005, Visual Basic 2008

Download:

Download des Beispielprojektes [13,9 KB]

' Dieser Quellcode stammt von http://www.activevb.de
' und kann frei verwendet werden. Für eventuelle Schäden
' wird nicht gehaftet.

' Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
' Ansonsten viel Spaß und Erfolg mit diesem Source!

' Projektversion:   Visual Studio 2008
' Option Strict:    Aus
' Option Explicit:  An
' Option Infer:     An
'
' Referenzen: 
'  - System
'  - System.Data
'  - System.Deployment
'  - System.Drawing
'  - System.Windows.Forms
'  - System.Xml
'  - System.Core
'  - System.Xml.Linq
'  - System.Data.DataSetExtensions
'
' Imports: 
'  - Microsoft.VisualBasic
'  - System
'  - System.Collections
'  - System.Collections.Generic
'  - System.Data
'  - System.Drawing
'  - System.Diagnostics
'  - System.Windows.Forms
'  - System.Linq
'  - System.Xml.Linq
'

' ##############################################################################
' ################################# Form1.vb ###################################
' ##############################################################################
Public Class Form1
    'Klasse refernzieren
    Private WithEvents _nwm As NetworkMonitor

    Private _savePath As String = Application.StartupPath & "\Adapter.ini"

    Private Sub Form1_Load(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles MyBase.Load

        'NetworkMonitor erzeugen
        _nwm = New NetworkMonitor()

        'Alle gültigen Adapter in eine Combobox laden
        Try
            ComboBox1.Items.AddRange(NetworkMonitor.GetAllNetworkInterfaces())
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Sub

    Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged

        'Dem NetworkMonitor einen gültigen Adapter zuweisen
        _nwm.selectedInterface = ComboBox1.SelectedItem.ToString()
    End Sub

    'Wird ausgeführt, wenn der NetworkMonitor das Event auslöst
    Private Sub GetValues() Handles _nwm.ReportValues
        'Die Werte an die Labels weiterreichen
        lblCurrentInBytes.Text = "Current in: " & _
            _nwm.currentInBytes.ToString("N0") & " Bytes/s"
        lblCurrentOutBytes.Text = "Current out: " & _
            _nwm.currentOutBytes.ToString("N0") & " Bytes/s"
        lblCurrentInBits.Text = "Current in: " & _
            _nwm.currentInBits.ToString("N0") & " Bits/s"
        lblCurrentOutBits.Text = "Current out: " & _
            _nwm.currentOutBits.ToString("N0") & " Bits/s"
        lblAvgInBytes.Text = "Average in: " & _
            _nwm.averageInBytes & " Bytes/s"
        lblAvgOutBytes.Text = "Average out: " & _
            _nwm.averageOutBytes & " Bytes/s"
        lblElapsedTime.Text = "Monitored time: " & _
            TimeSpan.FromSeconds(_nwm.monitoredTime).ToString()
        lblMaxInBytes.Text = "Maximum in: " & _
            _nwm.maxInBytes.ToString("N0") & " Bytes/sec"
        lblMaxOutBytes.Text = "Maximum out: " & _
            _nwm.maxOutBytes.ToString("N0") & " Bytes/sec"
        lblMaxInBits.Text = "Maximum in: " & _
            _nwm.maxInBits.ToString("N0") & " Bits/s"
        lblMaxOutBits.Text = "Maximum out: " & _
            _nwm.maxOutBits.ToString("N0") & " Bits/s"
        lblTotalInBytes.Text = "Total in: " & _
            _nwm.totalInBytes.ToString("N0") & " Bytes"
        lblTotalOutBytes.Text = "Total out: " & _
            _nwm.totalOutBytes.ToString("N0") & " Bytes"
        lblSelAdapter.Text = "Selected adapter: " & _
            _nwm.selectedInterface
    End Sub

    ' Gegenwärtige Werte speichern
    Private Sub btnSave_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles btnSave.Click

        _nwm.SaveNetworkValues(_savePath)
    End Sub

    ' Gespeicherte Werte laden   
    Private Sub btnLoad_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles btnLoad.Click

        _nwm.LoadAdapterValues(_savePath)
    End Sub
End Class

' ##############################################################################
' ############################# NetworkMonitor.vb ##############################
' ##############################################################################
Imports System.Windows.Forms

Public Class NetworkMonitor
    ' Den Adapter festlegen. Es werden nur gültige Interfaces angenommen
    Private _selectedInterface As String
    Public Property selectedInterface() As String
        Get
            Return _selectedInterface
        End Get
        Set(ByVal value As String)
            _t.Stop()
            Me.monitoredTime = 0
            _selectedInterface = value

            'Wird ein anderes Interface überwacht, alle Werte auf 0 setzen
            If _lstAvailableInterfaces.Contains(value) Then
                Me.totalInBytes = 0
                Me.totalOutBytes = 0
                Me.maxInBytes = 0
                Me.maxOutBytes = 0
                _perNetworkIn.InstanceName = value
                _perNetworkOut.InstanceName = value
                _t.Start()
            Else
                Throw New ArgumentException( _
                    "Kein gültiger Wert für selectedInterface")
            End If
        End Set
    End Property

    ' Empfangene Bytes
    Private _currentInBytes As Long
    Public ReadOnly Property currentInBytes() As Long
        Get
            Return _currentInBytes
        End Get
    End Property

    ' Gesendete Bytes
    Private _currentOutBytes As Long
    Public ReadOnly Property currentOutBytes() As Long
        Get
            Return _currentOutBytes
        End Get
    End Property

    ' Umrechnung in Bits
    Public ReadOnly Property currentInBits() As Long
        Get
            Return _currentInBytes * 8
        End Get
    End Property

    ' Umrechnung in Bits
    Public ReadOnly Property currentOutBits() As Long
        Get
            Return _currentOutBytes * 8
        End Get
    End Property

    ' Kummuliertes Volumen
    Private _totalInBytes As Long
    Public Property totalInBytes() As Long
        Get
            Return _totalInBytes
        End Get
        Set(ByVal value As Long)
            _totalInBytes = value
        End Set
    End Property

    ' Kummuliertes Volumen
    Private _totalOutBytes As Long
    Public Property totalOutBytes() As Long
        Get
            Return _totalOutBytes
        End Get
        Set(ByVal value As Long)
            _totalOutBytes = value
        End Set
    End Property

    ' Maximalwert
    Private _maxInBytes As Long
    Public Property maxInBytes() As Long
        Get
            Return _maxInBytes
        End Get
        Set(ByVal value As Long)
            _maxInBytes = value
        End Set
    End Property

    ' Maximalwert
    Private _maxOutBytes As Long
    Public Property maxOutBytes() As Long
        Get
            Return _maxOutBytes
        End Get
        Set(ByVal value As Long)
            _maxOutBytes = value
        End Set
    End Property

    ' Maximalwert in Bits
    Public ReadOnly Property maxInBits() As Long
        Get
            Return _maxInBytes * 8
        End Get
    End Property

    ' Maximalwert in Bits
    Public ReadOnly Property maxOutBits() As Long
        Get
            Return _maxOutBytes * 8
        End Get
    End Property

    ' Berechnung des Durchschnitts/sec
    Public ReadOnly Property averageInBytes() As Double
        Get
            Return Math.Round(_totalInBytes / Me.monitoredTime, 2)
        End Get
    End Property

    ' Berechnung des Durchschnitts/sec
    Public ReadOnly Property averageOutBytes() As Double
        Get
            Return Math.Round(_totalOutBytes / Me.monitoredTime, 2)
        End Get
    End Property

    ' Überwachungszeit
    Private _monitoredTime As Integer
    Public Property monitoredTime() As Integer
        Get
            Return _monitoredTime
        End Get
        Set(ByVal value As Integer)
            _monitoredTime = value
        End Set
    End Property

    ' Variablen für die eingestellte Sprache
    Private _culture As String
    Private Shared _categoryGerman As String = "Netzwerkschnittstelle"
    Private Shared _inCounterGerman As String = "Empfangene Bytes/s"
    Private Shared _outCounterGerman As String = "Bytes gesendet/s"
    Private Shared _categoryEnglish As String = "Network Interface"
    Private Shared _inCounterEnglish As String = "Bytes Received/sec"
    Private Shared _outCounterEnglish As String = "Bytes Sent/sec"
    Private Shared _errorMessage As String = _
        "Es werden nur deutsche und englische Sprachen unterstützt"

    ' PerformanceCounter referenzieren
    Private _perNetworkIn As PerformanceCounter
    Private _perNetworkOut As PerformanceCounter

    ' Tick-Tack
    Private WithEvents _t As New Timer

    ' Alle gültigen Adapter werden beim Erzeugen des 
    'NetworkMonitors hier aufgeliestet
    Private _lstAvailableInterfaces As New List(Of String)

    ' Event
    Public Event ReportValues()

    Public Sub New()
        ' Abfragen der Spracheinstellung
        _culture = My.Application.Culture.Name.Substring(0, 2)

        ' Anhand der eingestellten Sprache die PerformanceCounter erzeugen
        Select Case _culture
            Case Is = "de"
                _perNetworkIn = CreatePerformanceCounter(_categoryGerman, _
                    _inCounterGerman)
                _perNetworkOut = CreatePerformanceCounter(_categoryGerman, _
                    _outCounterGerman)
            Case Is = "en"
                _perNetworkIn = CreatePerformanceCounter(_categoryEnglish, _
                    _inCounterEnglish)
                _perNetworkOut = CreatePerformanceCounter(_categoryEnglish, _
                    _outCounterEnglish)
            Case Else
                Throw New ArgumentException(_errorMessage)
        End Select

        ' Alle gültigen Netzwerkadapter holen
        _lstAvailableInterfaces.AddRange(GetAllNetworkInterfaces())

        ' Timer auf 1 Sekunde setzen
        _t.Interval = 1000
    End Sub

    Private Sub _t_Tick(ByVal sender As Object, _
        ByVal e As System.EventArgs) Handles _t.Tick

        ' Aufzeichnungszeit um 1 Sekunde erhöhen
        monitoredTime += 1

        ' Werte erneuern
        GetNetworkValues()

        ' Ereignis auslösen
        RaiseEvent ReportValues()
    End Sub

    Private Sub GetNetworkValues()
        'Empfangene Bytes der letzten Sekunde holen
        _currentInBytes = _perNetworkIn.NextValue()

        'Gesamtvolumen addieren
        Me.totalInBytes += Me.currentInBytes

        'Prüfen, ob ein neues Maximum vorliegt
        If Me.currentInBytes > Me.maxInBytes Then
            Me.maxInBytes = Me.currentInBytes
        End If

        'Das selber für die gesendeten Bytes
        _currentOutBytes = _perNetworkOut.NextValue()
        Me.totalOutBytes += Me.currentOutBytes
        If Me.currentOutBytes > Me.maxOutBytes Then
            Me.maxOutBytes = Me.currentOutBytes
        End If
    End Sub

    ' Erspart ein wenig Tipparbeit
    Private Function CreatePerformanceCounter(ByVal category As String, _
        ByVal counter As String) As PerformanceCounter

        Dim p As New PerformanceCounter(category, counter)
        Return p
    End Function

    ' Routine zum evtl. Speichern der Werte in eine Datei
    Public Sub SaveNetworkValues(ByVal path As String)
        If Me.selectedInterface = "" Then
            MessageBox.Show("Kein Adapter ausgewählt")
            Exit Sub
        End If

        Using sw As New System.IO.StreamWriter(path)
            sw.WriteLine(Me.selectedInterface)
            sw.WriteLine(Me.totalInBytes)
            sw.WriteLine(Me.totalOutBytes)
            sw.WriteLine(Me.maxInBytes)
            sw.WriteLine(Me.maxOutBytes)
            sw.WriteLine(Me.monitoredTime)
            sw.Close()
        End Using
    End Sub

    ' Lädt die gespeicherten Werte aus einer Datei
    Public Sub LoadAdapterValues(ByVal path As String)
        If Not System.IO.File.Exists(path) Then
            MessageBox.Show("Diese Datei existiert nicht")
            Exit Sub
        End If

        Using sr As New System.IO.StreamReader(path)
            Me.selectedInterface = sr.ReadLine()
            Me.totalInBytes = sr.ReadLine()
            Me.totalOutBytes = sr.ReadLine()
            Me.maxInBytes = sr.ReadLine()
            Me.maxOutBytes = sr.ReadLine()
            Me.monitoredTime = sr.ReadLine()
            sr.Close()
        End Using
    End Sub

    ' Gibt alle gültigen Adapter als String-Array zurück
    Public Shared Function GetAllNetworkInterfaces() As String()
        Dim category As PerformanceCounterCategory

        Dim culture As String = My.Application.Culture.Name.Substring(0, 2)

        Select Case culture
            Case Is = "de"
                category = New PerformanceCounterCategory(_categoryGerman)
            Case Is = "en"
                category = New PerformanceCounterCategory(_categoryEnglish)
            Case Else
                Throw New ArgumentException(_errorMessage)
        End Select

        Dim interfaces() As String = category.GetInstanceNames()

        Return interfaces
    End Function
End Class

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.

Archivierte Nutzerkommentare 

Klicken Sie diesen Text an, wenn Sie die 1 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.

Kommentar von Tammo am 03.12.2008 um 15:32

Im Source wir die Systemsprache mit
My.Application.Culture.Name.Substring(0, 2)
ermittelt.
Bei Multi-Language-Systemen gibt's hier einen Fehler, weil als Culture zwar DE zurückgegeben wird, das Sysem aber intern mit EN arbeitet...
Besser wäre es hier, die Sprache mit My.Computer.Info.InstalledUICulture.Name.Substring(0, 2)
zu ermitteln.