Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0608: Gesendete und Empfangene Bytes aller Adapter auslesen

 von 

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:

Schwierigkeitsgrad 2

Verwendete API-Aufrufe:

RtlMoveMemory (CopyMemory), GetIfTable

Download:

Download des Beispielprojektes [3,06 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!

'------------- 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-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?

Ja, funktioniert!

Nein, funktioniert nicht bei mir!

VB-Version:

Windows-Version:

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).