Estoy desarrollando una aplicación que escucha en el puerto 3000. Aparentemente hay una instancia de que todavía escucha el puerto porque cada vez que lo inicio, no puede crear un escucha (C #, TcpListener, pero eso es irrelevante) porque el puerto ya está tomado.
Ahora, la aplicación no existe en el Administrador de tareas, así que traté de encontrar su PID y matarlo, lo que condujo a este resultado interesante:
C:\Users\username>netstat -o -n -a | findstr 0.0:3000
TCP 0.0.0.0:3000 0.0.0.0:0 LISTENING 3116
C:\Users\username>taskkill /F /PID 3116
ERROR: The process "3116" not found.
No he visto este comportamiento antes y pensé que era lo suficientemente interesante como para ver si alguien tiene una solución.
ACTUALIZACIÓN: inicié Process Explorer e hice una búsqueda de 3000 y encontré esto:
<Non-existent Process>(3000): 5552
Hice clic derecho sobre él y elegí "Cerrar asa". Ya no está en Process Explorer, pero aún aparece en netstat y todavía detiene la aplicación para que no inicie el oyente.
ACTUALIZACIÓN 2: Se encontró TCPView para Windows que muestra el proceso como "<non-existent>"
. Al igual que con CurrPorts, no sucede nada cuando intento cerrar la conexión en esta herramienta.
Respuestas:
Para evitar esperas interminables en el socket, su programa debe usar la función setsockopt con los parámetros SO_REUSEADDR y SO_RCVTIMEO:
fuente
Tuvimos el mismo problema y utilizamos Process Explorer de Microsoft Sysinternals para buscar el ID de proceso que ya no existía.
Resulta que el proceso fue referenciado por varios procesos DrWatson. Matar esos procesos liberó el puerto. DrWatson se usa para enviar volcados de memoria a Microsoft y esto estaba tomando varias horas porque el proceso que se bloqueó contenía varias decenas de GB de memoria en ese momento.
fuente
Creo que deberías probar CurrPorts
fuente
El problema probable es que su proceso ha iniciado otro proceso (secundario) que heredó el controlador de socket y aún se está ejecutando.
Hay varias formas de evitar esto, por ejemplo: ProcessStartInfo.UseShellExecute = true;
fuente
subprocess.call(..., cwd=..., shell=True)
como lanzador de aplicaciones en un servidor web de Python, y resultó que tenía que matar todos esos procesos secundarios para liberar el socket. Lo extraño es que estoy usando shell = True. Esto me molestó por años.¿Puedes ver el proceso en Process Explorer ? En caso afirmativo, puede matarlo desde allí, pero solo después de investigar qué es realmente (puede ver todos los dlls cargados en el proceso)
fuente
Intente lanzar una bandera '-b' en su comando netstat. Le indicará el nombre del ejecutable que está utilizando el puerto. Luego encuentra ese proceso en el administrador de tareas y mátalo allí. Si eso no funciona, publique cuál es el ejecutable que mantiene abierto el puerto.
fuente
Necesito mencionar el término persistir aquí.
Los detalles se pueden encontrar en http://msdn.microsoft.com/en-us/library/ms739165.aspx
En resumen: hay una opción que le dice al sistema de socket que mantenga un socket abierto incluso después de que se haya cerrado si hay datos no enviados.
En su aplicación C #, puede especificar cualquier opción relacionada a través de Socket.SetSocketOption: http://msdn.microsoft.com/en-us/library/1011kecd.aspx
Dado que todo lo mencionado está relacionado con el envío y los clientes, pero tuvimos problemas similares en el trabajo, algunas búsquedas posteriores revelaron que uno podría especificar la opción de retraso para los oyentes como se muestra en el ejemplo aquí: http://msdn.microsoft.com /library/system.net.sockets.tcplistener.server.aspx
Algunos colegas hablaron sobre los puertos retenidos por el sistema operativo después de la finalización / cierre de la aplicación durante aproximadamente dos minutos. Dado eso, sería interesante saber si el puerto aún se mantiene después de un cierto período de tiempo.
fuente
También me encuentro con este problema. Finalmente encontré mi razón. Es causada por el proceso principal invocado a un proceso secundario por popen en c / c ++. Pero el proceso principal se bloquea / apaga antes de invocar pclose. Luego, el puerto tratará el proceso principal aún en vivo y aún lo escuchará.
fuente
Tuve el mismo problema con xdebug, dejó el puerto 9000 abierto.
Logré cerrar con cmd usando "taskkill / pid xxxx".
El pid del proceso que usa el puerto se puede recuperar con "netstat -o".
Mi configuración fue win 7 home premium.
fuente
Tuve el mismo problema y lo solucioné:
netstat -o
¡Es interesante notar que netstat a veces puede devolver un pid pero no el nombre ejecutable correspondiente!
fuente
El problema puede ser causado si el proceso inactivo ha iniciado uno o más procesos secundarios. Si
se utilizó para iniciar un proceso secundario, depende del valor de los identificadores de herencia, por lo que con
Windows no bloqueará el puerto si el proceso principal se detiene y el proceso del cliente aún se está ejecutando.
fuente
Vimos un problema similar cuando la causa raíz era un proceso hijo creado heredando los puertos, el proceso padre se bloqueaba, mientras que el proceso hijo aún mantenía el puerto. La resolución fue identificar el proceso secundario que aún se está ejecutando y detenerlo. En el ejemplo aquí, el PID de proceso no existente era 7336
Para detener este proceso:
Y esto resolvió el problema.
fuente
¿Supongo que no tienes un firewall instalado (o has probado algunos tweeks de red de Windows)?
Algunos cortafuegos exhiben este tipo de comportamiento y pueden mantener abiertos los puertos.
Si tiene uno, intente deshabilitarlo y luego inicie su programa y ciérrelo para ver qué sucede.
fuente
Dado que su proceso aparece como Sistema, lo más probable es que pueda eliminarlo en el símbolo del sistema "Sistema". La cuenta del sistema tiene más privilegios que un administrador regular.
Puede obtener cmd.exe "Sistema" programando una tarea para cmd.exe (el programador se ejecuta como Sistema):
Cambie ese tiempo por algo en el futuro cercano. Asegúrese también de que está en la consola de la máquina (si está en una sesión normal de Terminal Server, no verá el nuevo cmd.exe. Inicie
mstsc
sesión en la consola). Creo que hay otras formas de hacerlo, pero esto funcionó para mí en el pasado.fuente
Yo tuve el mísmo problema. El proceso se estaba depurando mientras se bloqueaba, y todavía había un proceso vsjitdebugger.exe en un estado suspendido persistente, que aparentemente se refería al proceso que se estaba depurando. Matar ese proceso vsjitdebugger.exe resolvió el problema.
fuente
Un uso híbrido de TCPView y Process Explorer funcionó para mí;) Primero busqué en la identificación del proceso que estaba usando el puerto en TCPView. Aisló el proceso en Process Explorer y eliminó el proceso usando Process Explorer.
fuente