Estou desenvolvendo um aplicativo que escuta na porta 3000. Aparentemente, há uma instância dele ainda escutando a porta, porque sempre que inicio, ela não pode criar um ouvinte (C #, TcpListener, mas isso é irrelevante) porque a porta já está ocupado.
Agora, o aplicativo não existe no Gerenciador de tarefas, então tentei encontrar seu PID e matá-lo, o que levou a este resultado interessante:
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.
Eu nunca vi esse comportamento antes e achei que era interessante o suficiente para ver se alguém tem uma solução.
UPDATE: Iniciei o Process Explorer e fiz uma pesquisa por 3000 e encontrei o seguinte:
<Non-existent Process>(3000): 5552
Cliquei com o botão direito do mouse e escolhi "Fechar identificador". Ele não está mais no Process Explorer, mas ainda aparece no netstat e ainda impede o aplicativo de iniciar o ouvinte.
ATUALIZAÇÃO 2: Encontrado o TCPView para Windows que mostra o processo como "<non-existent>"
. Como no CurrPorts, nada acontece quando tento fechar a conexão nesta ferramenta.
Respostas:
Para evitar intermináveis esperas no soquete, seu programa deve usar a função setsockopt com os parâmetros SO_REUSEADDR e SO_RCVTIMEO:
fonte
Tivemos o mesmo problema e usamos o Process Explorer da Microsoft Sysinternals para procurar a identificação do processo que não existia mais.
Acontece que o processo foi referenciado por vários processos do DrWatson. Matar esses processos liberou a porta. O DrWatson é usado para enviar despejos de memória para a Microsoft e isso levou várias horas porque o processo travado continha várias dezenas de GBs de memória no momento.
fonte
Eu acho que você deveria tentar CurrPorts
fonte
O provável problema é que seu processo iniciou outro processo (filho) que herdou o identificador de soquete e ainda está em execução.
Existem várias maneiras de evitar isso, por exemplo: ProcessStartInfo.UseShellExecute = true;
fonte
subprocess.call(..., cwd=..., shell=True)
como iniciador de aplicativos em um servidor web python, e eu tive que matar todos esses processos filhos para liberar o soquete. O estranho é que estou usando shell = True. Isso me irritou por muito tempo.Você pode ver o processo no Process Explorer ? Se sim, você pode matá-lo a partir daí, mas somente depois de investigar o que realmente é (você pode ver todas as dlls carregadas no processo)
fonte
Tente lançar um sinalizador '-b' no seu comando netstat. Ele informará o nome do executável que está usando a porta. Então encontre esse proc no gerenciador de tarefas e mate-o lá. Se isso não funcionar, poste o executável que está mantendo a porta aberta.
fonte
Precisa mencionar o termo persistir aqui.
Detalhes podem ser encontrados em http://msdn.microsoft.com/en-us/library/ms739165.aspx
Em resumo: existe uma opção que informa ao sistema de soquetes para mantê-lo aberto, mesmo depois de fechado, se houver dados não enviados.
No aplicativo C #, você pode especificar qualquer opção relacionada via Socket.SetSocketOption: http://msdn.microsoft.com/en-us/library/1011kecd.aspx
Como todo o material mencionado está relacionado ao envio e aos clientes, mas tivemos problemas semelhantes no trabalho, algumas pesquisas revelaram que era possível especificar a opção de pausa para os ouvintes, conforme mostrado no exemplo aqui: http://msdn.microsoft.com /library/system.net.sockets.tcplistener.server.aspx
Alguns colegas falaram sobre as portas mantidas pelo sistema operacional após o encerramento / fechamento do aplicativo por cerca de dois minutos. Dado isso, seria interessante saber se a porta ainda é mantida após um certo período de tempo.
fonte
Eu também encontro esse problema. Finalmente eu encontrei o meu motivo. É causado pelo processo principal chamado um processo filho pelo popen no c / c ++. Mas o processo principal travar / desligar antes de chamar pclose. Em seguida, a porta tratará o processo principal ainda ativo e continuará a ouvi-lo.
fonte
Eu tive o mesmo problema com o xdebug, ele deixou a porta 9000 aberta.
Eu consegui fechar com o cmd usando "taskkill / pid xxxx".
O pid do processo usando a porta pode ser recuperado com "netstat -o".
Minha configuração foi ganhar 7 home premium.
fonte
Eu tive o mesmo problema e o corrigi:
netstat -o
Interessante notar que às vezes o netstat pode retornar um pid, mas não o nome do executável correspondente!
fonte
O problema pode ser causado se o processo morto iniciou um ou mais processos filhos. E se
foi usado para iniciar um processo filho, depende do valor das alças herdadas, portanto, com
O Windows não bloqueará a porta se o processo pai estiver parado e o processo do cliente ainda estiver em execução.
fonte
vi um problema semelhante quando a causa raiz foi um processo filho criado herdando as portas, o processo pai travou, enquanto o processo filho ainda mantinha a porta. A resolução era identificar o processo filho ainda em execução e pará-lo. No exemplo aqui, o processo PID inexistente foi 7336
Para parar este processo:
E isso resolveu o problema.
fonte
Suponho que você não tenha um firewall instalado (ou tentou alguma rede do Windows duas vezes)?
Alguns firewalls exibem esse tipo de comportamento e podem manter as portas abertas.
Se você tiver um, tente desativá-lo e, em seguida, inicie o seu programa, feche-o e veja o que acontece.
fonte
Como seu processo está listado como Sistema, provavelmente você pode matá-lo em um prompt de comando "Sistema". A conta do sistema tem mais privilégios do que um administrador comum.
Você pode obter o "System" cmd.exe agendando uma tarefa para o cmd.exe (o agendador é executado como System):
Mude esse tempo para algo no futuro próximo. Verifique se você está no console da máquina (se você estiver em uma sessão regular do servidor de terminal, não verá o novo cmd.exe. Faça o
mstsc
login no console). Acho que existem outras maneiras de fazer isso, mas isso funcionou para mim no passado.fonte
Eu tenho esse mesmo problema. O processo estava sendo depurado enquanto travava, e ainda havia um processo vsjitdebugger.exe em estado suspenso, o que aparentemente se referia ao processo que estava sendo depurado. Matar esse processo vsjitdebugger.exe resolveu o problema.
fonte
Um uso híbrido do TCPView e do Process Explorer funcionou para mim;) Procurei pela primeira vez a identificação do processo que estava usando a porta no TCPView. Isolado o processo no Process Explorer e eliminou o processo usando o Process Explorer.
fonte