VB.NET-Tipp 0091: Netzwerkgeschwindigkeit und Transfervolumen erfassen
von Samael
Beschreibung
Eine Klasse, mit der sich die Up- und Downloadgeschwindigkeit des Netzwerkadapters sowie das dabei transferierte Volumen erfassen lässt.
Schwierigkeitsgrad: | 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: |
' 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.