Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0491: Alle TCP-Ports und deren Status anzeigen

 von 

Beschreibung 

Dieser Code zeigt, wie man alle TCP-Ports und deren Status auflisten kann. Somit kann man einige der Daten des Programmes netstat bequemer ermitteln.

Schwierigkeitsgrad:

Schwierigkeitsgrad 2

Verwendete API-Aufrufe:

GetTcpTable

Download:

Download des Beispielprojektes [3,63 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 -------------
' Die Komponente 'Microsoft Windows Common Controls 6.0 (SP6) (MsComCtl.ocx)' wird benötigt.

'--------- Anfang Formular "Form1" alias Form1.frm  ---------
' Steuerelement: Listenanzeigesteuerungselement "ListView1"
' Steuerelement: Schaltfläche "Command1"
' Steuerelement: Beschriftungsfeld "Label1"
'http://www.tipsntricks.de

Private Sub Command1_Click()
    ListConnections
End Sub

Private Sub Form_Load()
    With ListView1
      .View = lvwReport

      Set clmX = .ColumnHeaders.Add(, , "Local Address")
      Set clmX = .ColumnHeaders.Add(, , "Local Port")
      Set clmX = .ColumnHeaders.Add(, , "Remote Address")
      Set clmX = .ColumnHeaders.Add(, , "Remote Port")
      Set clmX = .ColumnHeaders.Add(, , "State")
    End With
End Sub
'---------- Ende Formular "Form1" alias Form1.frm  ----------
'--------- Anfang Modul "Module1" alias Module1.bas ---------
'http://www.tipsntricks.de

Public Declare Function GetTcpTable Lib "IPHLPAPI.DLL" ( _
   ByRef pTcpTable As MIB_TCPTABLE, _
   ByRef pdwSize As Long, _
   ByVal border As Long) As Long

Public Type MIB_TCPROW
  dwState As tcpStates
  dwLocalAddr(0 To 3) As Byte
  dwLocalPort As String * 4
  dwRemoteAddr(0 To 3) As Byte
  dwRemotePort As String * 4
End Type

Public Type MIB_TCPTABLE
  dwNumEntries As Long
  Table(100) As MIB_TCPROW
End Type

Public Enum tcpStates
  TCP_STATE_CLOSED = 1
  TCP_STATE_LISTEN = 2
  TCP_STATE_SYN_SENT = 3
  TCP_STATE_SYN_RCVD = 4
  TCP_STATE_ESTAB = 5
  TCP_STATE_FIN_WAIT1 = 6
  TCP_STATE_FIN_WAIT2 = 7
  TCP_STATE_CLOSE_WAIT = 8
  TCP_STATE_CLOSING = 9
  TCP_STATE_LAST_ACK = 10
  TCP_STATE_TIME_WAIT = 11
  TCP_STATE_DELETE_TCB = 12
End Enum

Public Sub ListConnections()
  Dim ret As Long, tcpTable As MIB_TCPTABLE, intLoop As Integer
  Dim strState As String, strLocalAddr As String, strLocalPort As String
  Dim strRemoteAddr As String, strRemotePort As String
  Dim itemX As ListItem
  
    '### Hier Daten übergeben
    Form1.ListView1.ListItems.Clear
    '### ###
    
    ret = GetTcpTable(tcpTable, 2004, True)
    Select Case ret
      Case 0
        'Alles ok
        For intLoop = 0 To tcpTable.dwNumEntries - 1
          With tcpTable.Table(intLoop)
            strState = StateText(.dwState)
            strLocalAddr = .dwLocalAddr(0) & "." & _
                           .dwLocalAddr(1) & "." & _
                           .dwLocalAddr(2) & "." & _
                           .dwLocalAddr(3)
                           
            strLocalPort = CStr(GetPort(.dwLocalPort))
            strRemoteAddr = .dwRemoteAddr(0) & "." & _
                            .dwRemoteAddr(1) & "." & _
                            .dwRemoteAddr(2) & "." & _
                            .dwRemoteAddr(3)
                            
            If .dwState = TCP_STATE_ESTAB Then
              strRemotePort = CStr(GetPort(.dwRemotePort))
            Else
              strRemotePort = "0"
            End If
          End With
          
          '### Hier Daten übergeben
          Set itemX = Form1.ListView1.ListItems.Add(, , strLocalAddr)
          itemX.SubItems(1) = strLocalPort
          itemX.SubItems(2) = strRemoteAddr
          itemX.SubItems(3) = strRemotePort
          itemX.SubItems(4) = strState
          '### ###
        Next intLoop
      Case 232
        'Kein Netzwerk vorhanden
      Case Else
        'Unbekannter Fehler
    End Select
End Sub

Public Function StateText(State As Long) As String
    Select Case State
      Case TCP_STATE_CLOSED: StateText = "Closed"
      Case TCP_STATE_LISTEN: StateText = "Listening"
      Case TCP_STATE_SYN_SENT: StateText = "SYN Sent"
      Case TCP_STATE_SYN_RCVD: StateText = "SYN Recieved"
      Case TCP_STATE_ESTAB: StateText = "Established"
      Case TCP_STATE_FIN_WAIT1: StateText = "FIN Wait 1"
      Case TCP_STATE_FIN_WAIT2: StateText = "FIN Wait 2"
      Case TCP_STATE_CLOSE_WAIT: StateText = "Close Wait"
      Case TCP_STATE_CLOSING: StateText = "Closing"
      Case TCP_STATE_LAST_ACK: StateText = "Last ACK"
      Case TCP_STATE_TIME_WAIT: StateText = "Time Wait"
      Case TCP_STATE_DELETE_TCB: StateText = "PCB Deleted"
    End Select
End Function

Private Function GetPort(Port) As Long
    GetPort = Asc(Mid(Port, 1, 1))
    GetPort = GetPort * 256
    GetPort = GetPort + Asc(Mid(Port, 2, 1))
End Function

'---------- Ende Modul "Module1" alias Module1.bas ----------
'-------------- 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 11 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 Marco am 29.09.2005 um 13:32

Die API GetTcpTable hat ein kleines Problem. Wenn man den MS-SQL-Enterprisemanager oder den Query-Analyzer aufmacht und eine Weile wartet, schmiert entweder die komplette VB6-IDE ab, oder die kompillierte Executable. - Wenn jemand Rat weis, so melde er sich doch bitte bei mir (eMail) DANKE!!! :)
mfg Marco

Kommentar von BAD HONK am 08.02.2005 um 20:27

Versuchs mal mit PRIVATE DECLARE statt PUBLIC !!!

Kommentar von ratlos am 02.02.2005 um 18:10

Hallo!
Leider erhalte ich die Fehlermeldung "Fehler beim Kompilieren: Nach End Sub, End Function oder End Property können nur Kommentare stehen".

Markiert ist dann der Abschnitt:

Public Declare Function GetTcpTable Lib "IPHLPAPI.DLL" ( _
ByRef pTcpTable As MIB_TCPTABLE, _
ByRef pdwSize As Long, _
ByVal border As Long) As Long


Hat jemand einen Tip? (WinXP, VB 6)
Danke

Kommentar von cerebrus am 11.06.2004 um 14:22

@apo

mit

erste Spalte:
ListView1.ListItems(i).Text
Reihe i (i = 1 bis x)

ab zweiter Spalte:
ListView1.ListItems(i).ListSubItems(n).Text
Reihe i (i = 1 bis x) und Spalte n (n = 1 bis x)

Kommentar von apo am 30.05.2004 um 03:48

hallo... kann mir jemand sagen wie ich die daten aus dem listview auslesen kann??

hab keine ahnung vom listview und hätte das ganze gerne in einer normalen liste...

zb. in diesem format:
remoteport;state

oder von mir aus auch einfach inne variable ob port 80 oder 3128 established sind

konnte zum listview auch kein tutorial oder ähnliches finden :(

danke
apo

Kommentar von MadInfanterist am 18.05.2004 um 16:30

"Von MKS-VIRUS am 13.08.2002 um 22:50
Ich benuze VB.NET mit WIN2K und es funktioniert leider nicht :( "
das is ja auch kein code für vb.net vb.net is was ganz anderes als VB6/5 etc

Kommentar von am 28.11.2003 um 10:16

This is good.

Kommentar von Dirk Euhus am 19.02.2003 um 12:32

Hallo,
das Prog lief unter VB6 unt Win2K einwandfrei, bis zu der Situation,
daß der ret - Wert nur noch 122 anzeigt.
122: ERROR_INSUFFICIENT_BUFFER

Dim lenProtokoll As Long
lenProtokoll = 2004
1. Aufruf zur Ermittlung lenProtokoll
ret = GetTcpTable(tcpTable, lenProtokoll, True)
2. Aufruf mit korrekter Puffergröße Ermittlung lenProtokoll
ret = GetTcpTable(tcpTable, lenProtokoll, True)

... weiter unten dann:
If UBound(tcpTable.Table) >= intLoop Then

So bekommt man zwar die notwendige
Größe des Puffers, daß Prog läuft wieder, aber ich bin mir nicht sicher,
welcher Teil dort abgeschnitten wird.

Irgendeine Idee zur Lösung ?

Danke im voraus.

mfg Euhus

Kommentar von aTriX am 02.02.2003 um 19:12

hmmmmm kannst du ned lesen ?
alle TCP-Ports !!!

Kommentar von MKS-VIRUS am 13.08.2002 um 22:50

Ich benuze VB.NET mit WIN2K und es funktioniert leider nicht :(

Kommentar von Lutz am 07.07.2002 um 13:49

Alle Ports ist wohl uebertrieben ;)
Wo sind denn da die UDP-Ports ???