Si quiero averiguar qué proceso está escuchando en qué socket, puedo usar netstat / TCPview y lo veré de inmediato. Sin embargo, es posible enlazar 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, e intentar ejecutar el mismo código en una segunda instancia mientras la primera aún se está ejecutando dará como resultado un error. Sin embargo, a menos que realmente comience a escuchar en ese puerto usando
s.listen(1)
el puerto no aparece en netstat / TCPview.
La pregunta es: ¿es posible ver qué puertos están vinculados (pero no están escuchando) y qué proceso los vincula?
El fondo de esto es que yo he tenido un rango de movimiento de 1976 puertos que no se pueden unir , y quiero saber lo que 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 acerca de 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 para FAIL)
Respuestas:
Deberías usar
con
Valor de TableClass = TCP_TABLE_OWNER_PID_ALL "o" TCP_TABLE_OWNER_PID_CONNECTIONS "o" TCP_TABLE_OWNER_PID_LISTENER
pTcpTable structure -> MIB_TCPTABLE_OWNER_PID
dependiendo de la información que le gustaría 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 uno
dwState
debe tenerMIB_TCP_STATE_CLOSED
cuando está vinculado y no escucha, esta estructura también ofrecedwLocalAddr
ydwLocalPort
fuente
En versiones recientes de netstat ahora hay un parámetro de línea de comando -q que muestra esos sockets.
Ejemplo de uso:
Parece que no hay una API pública para obtener los sockets en esa situación. Vea mi pregunta en StackOverflow .
fuente