Si quiero saber cual es el procesoescuchandoen qué socket puedo usar netstat/TCPview y lo veré inmediatamente. Sin embargo, es posible vincularse a una dirección sin escuchar. Si se hace esto, no aparece en netstat/TCPview, pero bloquea el socket.
Ejemplo de Python:
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('0.0.0.0',12345))
El puerto ahora está vinculado y si intenta ejecutar el mismo código en una segunda instancia mientras la primera aún se está ejecutando, se producirá un error. Sin embargo, a menos que realmente empieces a escuchar en ese puerto usando
s.listen(1)
el puerto no aparece en netstat/TCPview.
La pregunta es: ¿Es posible ver qué puertos son?atado(pero sin escuchar) y ¿qué proceso los vincula?
El trasfondo de esto es que he tenido unarango móvil de 1976 puertos que no se pueden vincular, y quiero saber qué causa esto. Mientras tanto, determiné mediante prueba y error que la Conexión compartida a Internet estaba bloqueando esos puertos, pero todavía tengo curiosidad por saber la respuesta a esta pregunta.
Editar:Debido a una solicitud popular, aquí está el código que utilicé para encontrar esos puertos:
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"
(es posible que desee canalizar la salida a grep y filtrar solo por FALLO)
Respuesta1
Tuve que hacer exactamente esto hoy. Powershell puede hacerlo con 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
Respuesta2
En versiones recientes de netstat ahora hay un parámetro de línea de comando -q que muestra esos sockets.
$ 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.
...
Ejemplo de uso:
$ 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
...
Parece que no existe una API pública para obtener los sockets en esa situación. Mira mipregunta en StackOverflow.
Respuesta3
Deberías usar
DWORD GetExtendedTcpTable (PVOID pTcpTable,PDWORD pdwSize, BOOL border, ULONG ulAf, TCP_TABLE_CLASS TableClass,ULONG Reserved);
con
Valor de TableClass = TCP_TABLE_OWNER_PID_ALL "o" TCP_TABLE_OWNER_PID_CONNECTIONS "o" TCP_TABLE_OWNER_PID_LISTENER
Estructura pTcpTable -> MIB_TCPTABLE_OWNER_PID
dependiendo de la información que quieras recuperar
EDITAR:
TCP_TABLE_OWNER_PID_ALL devuelve la estructura MIB_TCPTABLE_OWNER_PID que es una matriz de estructuras MIB_TCPROW_OWNER_PID donde cada una dwState
debe tener MIB_TCP_STATE_CLOSED
cuando está vinculada y no escuchando, esta estructura también ofrece dwLocalAddr
ydwLocalPort
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;