Wenn ich herausfinden möchte, welcher ProzessHörenauf welchem Socket, kann ich netstat/TCPview verwenden und werde es sofort sehen. Es ist jedoch möglich, eine Bindung an eine Adresse vorzunehmen, ohne zuzuhören. Wenn dies getan wird, wird es nicht in netstat/TCPview angezeigt, blockiert aber den Socket.
Python-Beispiel:
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('0.0.0.0',12345))
Der Port ist nun gebunden und der Versuch, denselben Code in einer zweiten Instanz auszuführen, während die erste noch läuft, führt zu einem Fehler. Wenn Sie jedoch nicht tatsächlich mit dem Abhören dieses Ports beginnen, indem Sie
s.listen(1)
der Port wird in Netstat/TCPview nicht angezeigt.
Die Frage ist: Ist es möglich zu sehen, welche Portsgebunden(aber nicht zuhören) und welcher Prozess bindet sie?
Der Hintergrund hierfür ist, dass ich einegleitender Bereich von 1976 Ports, die nicht gebunden werden können, und ich möchte wissen, woran das liegt. In der Zwischenzeit habe ich durch Ausprobieren herausgefunden, dass die gemeinsame Nutzung der Internetverbindung diese Ports blockiert, aber ich bin immer noch neugierig auf die Antwort auf diese Frage.
Bearbeiten:Aufgrund der hohen Nachfrage ist hier der Code, den ich zum Suchen dieser Ports verwendet habe:
import time
import socket
for i in range(0,65536):
try:
print "Listening on port", i, '...',
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serversocket.bind(('0.0.0.0', i))
serversocket.listen(5)
#time.sleep(0.1)
serversocket.close()
print "ok"
except:
print "FAIL"
(Sie möchten möglicherweise die Ausgabe an grep weiterleiten und nur nach FAIL filtern)
Antwort1
Genau das musste ich heute machen. Powershell kann das mit Get-NetTCPConnection
.
PS C:\WINDOWS\system32> Get-NetTCPConnection -LocalPort 53100
LocalAddress LocalPort RemoteAddress RemotePort State AppliedSetting OwningProcess
------------ --------- ------------- ---------- ----- -------------- -------------
0.0.0.0 53100 0.0.0.0 0 Bound 40120
PS C:\WINDOWS\system32> get-process -PID 40120
Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName
------- ------ ----- ----- ------ -- -- -----------
2133 1331 13884 30740 30,955.31 40120 1 HWMonitorPro
Antwort2
In neueren Versionen von netstat gibt es jetzt einen Befehlszeilenparameter -q, der diese Sockets anzeigt.
$ netstat -?
Displays protocol statistics and current TCP/IP network connections.
NETSTAT [-a] [-b] [-e] [-f] [-n] [-o] [-p proto] [-r] [-s] [-x] [-t] [interval]
-a Displays all connections and listening ports.
-b Displays the executable involved in creating...
...
-p proto Shows connections for the protocol specified...
-q Displays all connections, listening ports, and bound
nonlistening TCP ports. Bound nonlistening ports may or may not
be associated with an active connection.
-r Displays the routing table.
...
Anwendungsbeispiel:
$ netstat -nq -p tcp
Active Connections
Proto Local Address Foreign Address State
TCP 0.0.0.0:7 0.0.0.0:0 LISTENING
TCP 0.0.0.0:9 0.0.0.0:0 LISTENING
TCP 0.0.0.0:13 0.0.0.0:0 LISTENING
...
TCP 192.168.122.157:50059 54.213.66.195:443 ESTABLISHED
TCP 0.0.0.0:49676 0.0.0.0:0 BOUND
TCP 0.0.0.0:49700 0.0.0.0:0 BOUND
TCP 0.0.0.0:49704 0.0.0.0:0 BOUND
TCP 0.0.0.0:49705 0.0.0.0:0 BOUND
...
Es scheint, dass es in dieser Situation keine öffentliche API gibt, um die Sockets zu erhalten. Siehe meineFrage in StackOverflow.
Antwort3
du solltest benutzen
DWORD GetExtendedTcpTable (PVOID pTcpTable, PDWORD pdwSize, BOOL bOrder, ULONG ulAf, TCP_TABLE_CLASS TableClass, ULONG Reserviert);
mit
TableClass-Wert = TCP_TABLE_OWNER_PID_ALL "oder" TCP_TABLE_OWNER_PID_CONNECTIONS "oder" TCP_TABLE_OWNER_PID_LISTENER
pTcpTable-Struktur -> MIB_TCPTABLE_OWNER_PID
abhängig von den Informationen, die Sie abrufen möchten
BEARBEITEN:
TCP_TABLE_OWNER_PID_ALL gibt die MIB_TCPTABLE_OWNER_PID-Struktur zurück, die ein Array von MIB_TCPROW_OWNER_PID-Strukturen ist, wobei jede Struktur, wenn sie gebunden dwState
ist MIB_TCP_STATE_CLOSED
und nicht zuhört, auch folgendes bietet dwLocalAddr
:dwLocalPort
typedef struct _MIB_TCPROW_OWNER_PID {
DWORD dwState;
DWORD dwLocalAddr;
DWORD dwLocalPort;
DWORD dwRemoteAddr;
DWORD dwRemotePort;
DWORD dwOwningPid;
} MIB_TCPROW_OWNER_PID, *PMIB_TCPROW_OWNER_PID;