Applikation zum TCP-Port ermitteln

  • Hallo an Alle

    Ich möchte in meinem Server-Script, das das Script auf einem TCP-Port, nur einmal gestartet werden kann. Sollte das Server-Script aber einen anderen Port nutzen, kann es ein zweites mal gestartet werden.

    Es ist also schlecht, nur mit ProcessExists zu arbeiten!

    Gibt es eine Möglichkeit in AutoIt, damit ich prüfen kann, welcher Processname einen TCP-Port geöffnet hat ???


    Gruß
    micha_he

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

    • Offizieller Beitrag

    Hab noch keine Lösung, als Ansatz: Die benutzten Ports abfragen mit netstat -a -n
    Nun noch der Schritt, diese auf die jeweiligen Anwendungen zurückzuführen. Ich such mal ein bischen.

    Edit:
    Hab was: TCPView

    Zitat

    TCPView ist ein Windows-Programm, das eine detaillierte Auflistung aller TCP- und UDP-Endpunkte auf Ihrem System enthält. Dazu gehören die lokalen Adressen sowie die Remoteadressen und Status der TCP-Verbindungen. Unter Windows NT, 2000 und XP berichtet TCPView auch den Namen des Prozesses, der den Endpunkt besitzt.



    Edit2:

    :D Es geht viel einfacher
    netstat -ano (ab Win2k) liefert auch die PID.

  • Ich habe jetzt sogar noch etwas im englischen Forum gefunden. Leider fehlt hierbei die PID !

    Spoiler anzeigen
    [autoit]

    #include <array.au3>
    _ArrayDisplay(_GetTCPTable())

    [/autoit] [autoit][/autoit] [autoit]

    ;~ _GetTCPtable( [optional handle to "ws2_32.dll" [, optional handle to "iphlpapi.dll" ] ] )
    ;~
    ;~ Return Value
    ;~ Success: TCPtable[][] = 2-D array
    ;~ [0][0] = number of connections
    ;~ for connection n:
    ;~ [n][0] = connection state (integer)
    ;~ [n][1] = local IP
    ;~ [n][2] = local port
    ;~ [n][3] = remote IP
    ;~ [n][4] = remote port
    ;~ [n][5] = connection state (informative text)
    ;~ Failure: TCPtable[0][0] = -1

    [/autoit] [autoit][/autoit] [autoit]

    Func _GetTCPtable($WSdll = "ws2_32.dll", $IHdll = "iphlpapi.dll")

    [/autoit] [autoit][/autoit] [autoit]

    Local Const $connState[12] = ["CLOSED", "LISTENING", "SYN_SENT", "SYN_RCVD", "ESTABLISHED", "FIN_WAIT1", _
    "FIN_WAIT2", "CLOSE_WAIT", "CLOSING", "LAST_ACK", "TIME_WAIT", "DELETE_TCB"]

    Local $TCPtable[1][1] = [[ -1]] ; preset to "failed"
    $dwSize = DllStructCreate("dword") ; for MIB_TCPTABLE buffer size

    [/autoit] [autoit][/autoit] [autoit]

    $MIB_TCPTABLE = DllStructCreate("dword") ; nominal struct initially
    DllStructSetData($dwSize, 1, 0) ; force zero size
    $ret = DllCall($IHdll, "int", "GetTcpTable", "ptr", DllStructGetPtr($MIB_TCPTABLE), "ptr", DllStructGetPtr($dwSize), "int", 1) ; get size
    If @error Or $ret[0] <> 122 Then Return $TCPtable ; dllCall error or RC is *not* ERROR_INSUFFICIENT_BUFFER = 122

    [/autoit] [autoit][/autoit] [autoit]

    $MIB_TCPTABLE = ""
    For $i = 1 To DllStructGetData($dwSize, 1) / 4 ; make to requested size of buffer
    $MIB_TCPTABLE &= "dword;"
    Next
    $MIB_TCPTABLE = DllStructCreate(StringTrimRight($MIB_TCPTABLE, 1)) ; requested struct
    DllStructSetData($dwSize, 1, DllStructGetSize($MIB_TCPTABLE)) ; recheck its size
    $ret = DllCall($IHdll, "int", "GetTcpTable", "ptr", DllStructGetPtr($MIB_TCPTABLE), "ptr", DllStructGetPtr($dwSize), "int", 1) ; get data
    If @error Or $ret[0] Then Return $TCPtable ; dllCall error or RC is Error

    [/autoit] [autoit][/autoit] [autoit]

    $numTCPentries = DllStructGetData($MIB_TCPTABLE, 1) ; number of entries
    ReDim $TCPtable[$numTCPentries + 1][6]

    For $i = 1 To $numTCPentries
    $offset = ($i - 1) * 5 + 1 ; dword offset into struct
    $TCPtable[$i][0] = DllStructGetData($MIB_TCPTABLE, $offset + 1) ; integer connection state
    $TCPtable[$i][5] = $connState[$TCPtable[$i][0] - 1] ; connection state text

    $ret = DllCall($WSdll, "str", "inet_ntoa", "uint", DllStructGetData($MIB_TCPTABLE, $offset + 2)) ; local IP / translate
    If @error Then Return $TCPtable ; dllCall error
    $TCPtable[$i][1] = $ret[0]
    $ret = DllCall($WSdll, "ushort", "ntohs", "uint", DllStructGetData($MIB_TCPTABLE, $offset + 3)) ; local port / translate
    If @error Then Return $TCPtable ; dllCall error
    $TCPtable[$i][2] = $ret[0]

    If $TCPtable[$i][0] <= 2 Then ; CLOSED or LISTENING state
    $TCPtable[$i][3] = "0.0.0.0"
    $TCPtable[$i][4] = 0
    Else
    $ret = DllCall($WSdll, "str", "inet_ntoa", "uint", DllStructGetData($MIB_TCPTABLE, $offset + 4)) ; remote IP / translate
    If @error Then Return $TCPtable ; dllCall error
    $TCPtable[$i][3] = $ret[0]
    $ret = DllCall($WSdll, "ushort", "ntohs", "uint", DllStructGetData($MIB_TCPTABLE, $offset + 5)) ; remote port / translate
    If @error Then Return $TCPtable ; dllCall error
    $TCPtable[$i][4] = $ret[0]
    EndIf
    Next

    [/autoit] [autoit][/autoit] [autoit]

    $dwSize = 0
    $MIB_TCPTABLE = 0
    $TCPtable[0][0] = $numTCPentries ; success
    Return $TCPtable

    EndFunc ;==>_GetTCPtable

    [/autoit]

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

  • Kann man sich denn überhaupt mehrmals auf ein Port setzen ?
    Kannst ja in deinem Programm erst testen ob er auf den Port Zugriff hat und wenn das nicht der Fall ist kann man ja immernoch testen woran das liegen könnte (z.B. mit netstat oder binden auf nen anderen Port).

  • Nein, ein bereits geöffneter/benutzter Port wird natürlich abgefragt und mit Fehlermeldung abgefangen.

    Es geht aber um ein Programm, was in AllUsers\Autostart liegt. Und wenn man sich unter WindowsXP auf einen anderen Benutzer ummeldet, startet das Programm ein weiteres mal und meldet der Port wäre in Benutzung.
    Nun war also die Idee, das Tool darf nur einmal laufen !
    Auch schlecht... Man könnte es ja auf zwei verschiedenen Ports, für zwei verschiedene Anwendungen starten.

    Also neuer Ansatz. Wenn das Tool bereits auf dem gewählten Port gestartet wurde, soll keine Fehlermeldung kommen. Das Tool beendet sich einfach.

    Die Lösung mit "netstat" von BugFix läuft. Nur ist sie davon abhängig, das der PC "netstat" hat und dieses die Option "-ona" beherrscht.
    Deswegen war ich auf der Suche, nach einer weitere Möglichkeit ohne externe Tools, z.B. über WinAPI.

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"