VB 5/6-Tipp 0608: Gesendete und Empfangene Bytes aller Adapter auslesen
von NoOne
Beschreibung
Im Gegensatz zu Tipp 55 zeigt dieser Tipp, wie man die gesendeten und empfangenen Bytes aller Adapter auslesen kann.
Update nach einem Hinweis von Florian Rittmeier:
Nun werden auch alle Adapter angezeigt.
Update am 31. August 2004 von Florian Rittmeier: Die angezeigten Zahlen stimmen nun.
Schwierigkeitsgrad: | Verwendete API-Aufrufe: | 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! '------------- Anfang Projektdatei Projekt1.vbp ------------- '--------- Anfang Formular "Form1" alias Form1.frm --------- ' Steuerelement: Listen-Steuerelement "lstSend" ' Steuerelement: Listen-Steuerelement "lstReceived" ' Steuerelement: Listen-Steuerelement "lstNic" ' Steuerelement: Timersteuerelement "Timer1" ' Steuerelement: Schaltfläche "Command1" ' Steuerelement: Beschriftungsfeld "Label3" ' Steuerelement: Beschriftungsfeld "Label2" ' Steuerelement: Beschriftungsfeld "Label1" Option Explicit Private Declare Function GetIfTable Lib "iphlpapi.dll" ( _ ByRef pIfTable As Any, _ ByRef pdwSize As Long, _ ByVal bOrder As Long) As Long Private Declare Sub CopyMemory Lib "kernel32" _ Alias "RtlMoveMemory" ( _ dst As Any, _ src As Any, _ ByVal bcount As Long) Private Const MAX_INTERFACE_NAME_LEN As Long = 256& Private Const ERROR_SUCCESS As Long = 0& Private Const MAXLEN_IFDESCR As Long = 256& Private Const MAXLEN_PHYSADDR As Long = 8& Private Const MIB_IF_TYPE_OTHER As Long = 1& Private Const MIB_IF_TYPE_ETHERNET As Long = 6& Private Const MIB_IF_TYPE_TOKENRING As Long = 9& Private Const MIB_IF_TYPE_FDDI As Long = 15& Private Const MIB_IF_TYPE_PPP As Long = 23& Private Const MIB_IF_TYPE_LOOPBACK As Long = 24& Private Const MIB_IF_TYPE_SLIP As Long = 28& Private Type MIB_IFROW wszName(0 To (MAX_INTERFACE_NAME_LEN - 1) * 2) As Byte dwIndex As Long dwType As Long dwMtu As Long dwSpeed As Long dwPhysAddrLen As Long bPhysAddr(0 To MAXLEN_PHYSADDR - 1) As Byte dwAdminStatus As Long dwOperStatus As Long dwLastChange As Long dwInOctets As Long dwInUcastPkts As Long dwInNUcastPkts As Long dwInDiscards As Long dwInErrors As Long dwInUnknownProtos As Long dwOutOctets As Long dwOutUcastPkts As Long dwOutNUcastPkts As Long dwOutDiscards As Long dwOutErrors As Long dwOutQLen As Long dwDescrLen As Long bDescr(0 To MAXLEN_IFDESCR - 1) As Byte End Type Private Sub Command1_Click() 'Beenden Unload Me End Sub Private Sub Form_Load() Timer1_Timer End Sub Private Sub Timer1_Timer() 'Die Informationen auslesen GetEthernetInfo End Sub Private Sub GetEthernetInfo() Dim IPInterfaceRow As MIB_IFROW Dim buff() As Byte Dim cbRequired As Long Dim nStructSize As Long Dim nRows As Long Dim cnt As Long 'Puffergröße auslesen Call GetIfTable(ByVal 0&, cbRequired, 1) If cbRequired > 0 Then ReDim buff(0 To cbRequired - 1) If GetIfTable(buff(0), cbRequired, 1) = ERROR_SUCCESS Then nStructSize = LenB(IPInterfaceRow) 'Die Anzahl der Adapter auslesen CopyMemory nRows, buff(0), 4 lstNic.Clear lstReceived.Clear lstSend.Clear 'Für jeden Adapter... For cnt = 1 To nRows '...Informationen in eine Struktur kopieren CopyMemory IPInterfaceRow, buff(4 + (cnt - 1) * _ nStructSize), nStructSize If IPInterfaceRow.dwType = MIB_IF_TYPE_ETHERNET Then 'Informationen auslesen und anzeigen lstNic.AddItem GetName(IPInterfaceRow.bDescr) lstReceived.AddItem FormatNumber( _ SignedToUnsignedLong( _ IPInterfaceRow.dwInOctets) _ / 1024, 0) lstSend.AddItem FormatNumber( _ SignedToUnsignedLong( _ IPInterfaceRow.dwOutOctets) _ / 1024, 0) End If Next cnt End If End If End Sub ' Wandelt ein (Byte-) Array in einen String um Private Function GetName(ByRef arr) As String Dim i As Integer Dim str As String For i = LBound(arr) To UBound(arr) str = str & Chr$(arr(i)) Next i GetName = str End Function ' Danke an K. Langbein für die Funktion! Private Function SignedToUnsignedLong(ByVal LongIn As Long) As Double If LongIn < 0 Then SignedToUnsignedLong = LongIn + 4294967296# Else SignedToUnsignedLong = LongIn End If End Function '---------- Ende Formular "Form1" alias Form1.frm ---------- '-------------- Ende Projektdatei Projekt1.vbp --------------
Tipp-Kompatibilität:
Windows/VB-Version | Win32s | Win95 | Win98 | WinME | WinNT4 | Win2000 | WinXP |
VB4 | |||||||
VB5 | |||||||
VB6 |
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 10 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 Michael Hollmayer am 17.09.2005 um 19:24
Hallo Frank,
danke für deine Hilfe, bin allerdings anfänger und weiss nicht genau wo ich den code einbauen soll. ausserdem hab ich festgestellt das das Progarmm den aufgelaufenen traffic zählt, ich würde aber gerne wissen wieviel Mbits gerade über die Karte laufen. ist das irgendwie möglich ?
grüsse mike
Kommentar von Frank1971 am 17.09.2005 um 17:21
Die KB inMB umrechnen habe ich über eine Select Case anweisung gelöst.
Hoffe es Hilft...
Gruß aus Paderborn
Frank Rauer
I = SignedToUnsignedLong(IPInterfaceRow.dwInOctets) / 1024
O = SignedToUnsignedLong(IPInterfaceRow.dwOutOctets) / 1024
Select Case I
Case 0 To 999
Label1 = Format(SignedToUnsignedLong(I), "##0")
Label10 = "KB"
Case 1000 To 999999
Label1 = Format(SignedToUnsignedLong(I), "##0,000")
Label10 = "KB"
Case 1000000 To 999999999
Label1 = Format(SignedToUnsignedLong(I) / 1000, "##0,000")
Label10 = "MB"
Case Is > 1000000000
Label1 = Format(SignedToUnsignedLong(I) / 1000000, "##0,000")
Label10 = "GB"
End Select
Select Case O
Case 0 To 999
Label2 = Format(SignedToUnsignedLong(O), "##0")
Label11 = "KB"
Case 0 To 999999
Label2 = Format(SignedToUnsignedLong(O), "##0,000")
Label11 = "KB"
Case 1000000 To 999999999
Label2 = Format(SignedToUnsignedLong(O) / 1000, "##0,000")
Label11 = "MB"
Case Is > 1000000000
Label2 = Format(SignedToUnsignedLong(O) / 1000000, "##0,000")
Label11 = "GB"
End Select
Kommentar von Michael Hollmayer am 17.09.2005 um 08:48
Hallo,
wie kann ich die kb anzeige in eine MB anzeige umwandeln.
danke und grüsee mike
Kommentar von Pete am 15.08.2005 um 22:46
Amok, dankeschoen.
Hab mir ein ein kleines Programm geschrieben, welches mir die aktuelle geschwindigkeit anzeigt.
thx
Kommentar von Mayr Klaus am 11.01.2005 um 21:39
Ein hervorragender Tipp. Ich habe dieses Beispielprojekt verwendet, um daraus ein Modul zu entwickeln, das die prozentuale Ausnutzung der Bandbreite eines Adapters ermittelt und in einer kleinen Kurve darstellt.
Parallel hierzu werden die Daten in eine Logdatei im CSV-Format geschrieben, die dann über Excel oder andere Tools
grafisch auswertbar sind.
Ich will damit die Server in meiner Firma überprüfen, ob eine Aufrüstung auf Gigabit Ethernet sinnvoll ist, oder ob sich bei geringer Auslastung die Netzwerkkarten dann eher zu Tode langweilen...
Kommentar von Frank am 27.11.2004 um 15:10
Klasse Tipp. Wollte damit meinen Internet-Volumenstarif kontrollieren. Seit ich jedoch ein kleines Netzwerk aufgebaut habe, bekomme zu viele Daten. Nicht nur die des Internets, sonder Alle, die über diese Netzwerkkarte kommen.
Meine Frage:
Gibt es eine Möglichkeit, die geseneten und empfangenen Daten zu selektieren, sprich von welcher Stelle sie kommen? z.B. an hand des Ports oder der Router-IP?
Vielen Dank für Eure Hilfe
Frank
Kommentar von Jens am 16.06.2004 um 19:33
Danke schön!
Das scheint genau das zu sein, was ich gesucht hatte. Leider hatte ich andere Stichworte eingegeben.
Kommentar von Enno am 23.11.2003 um 08:57
Danke NoOne ! Das ist wenigstens mal ein Ansatz, der auch wirklich funktioniert (WIN98SE). Allerdings ist die Umsetzung nicht ganz korrekt. Die MTU gibt doch nur die MAXIMALE Paketgrösse an (meist 1500 bytes -> Windows-Standard) ; die tatsächliche ist aber oftmals viel kleiner (und variabel). Daher mein Vorschlag: Statt mit der MTU und der Anzahl der Pakete das Datenvolumen zu errechnen, lesen wir doch einfach die Anzahl der Octete aus. 1 Octet = 8 bit = 1 byte. Dann funktioniert es auch ordentlich.
So könnte das dann aussehen :
lstReceived.AddItem _
Format((IPInterfaceRow.dwInOctets / 1024), "0.0") & " kB"
lstSend.AddItem _
Format((IPInterfaceRow.dwOutOctets / 1024), "0.0") & " kB"
<Enno>
Kommentar von Jonathan am 27.09.2003 um 12:30
Es laüft.
Bei gesendeten und enpfangenen werden aber merkwürdigerweise immer ähnliche Werte angezeigt. (mit einem Unterschied von ~6-20)
Mein Betriebssystem ist Win98...
Kommentar von Andreas W am 10.09.2003 um 00:02
Klasse Tip ! Läuft übrigens unter allen Windows-Versionen, nicht nur unter XP (hab´s mit NT, 98, 95 und ME probiert).