Ich entwickle eine App, die auf Port 3000 lauscht. Anscheinend hört eine Instanz den Port immer noch ab, da sie beim Starten keinen Listener erstellen kann (C #, TcpListener, aber das ist irrelevant), da der Port bereits vorhanden ist genommen.
Da die App im Task-Manager nicht vorhanden ist, habe ich versucht, ihre PID zu finden und sie zu beenden. Dies führte zu folgendem interessanten Ergebnis:
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.
Ich habe dieses Verhalten noch nie gesehen und dachte, es sei interessant genug, um zu sehen, ob jemand eine Lösung hat.
UPDATE: Ich habe Process Explorer gestartet und nach 3000 gesucht und Folgendes gefunden:
<Non-existent Process>(3000): 5552
Ich habe mit der rechten Maustaste darauf geklickt und "Close Handle" gewählt. Es befindet sich nicht mehr im Prozess-Explorer, wird jedoch weiterhin in netstat angezeigt und verhindert, dass die App den Listener startet.
UPDATE 2: TCPView für Windows gefunden, die den Prozess als anzeigen"<non-existent>"
. Wie bei CurrPorts passiert nichts, wenn ich versuche, die Verbindung in diesem Tool zu schließen.
Antworten:
Um endlose Wartezeiten am Socket zu vermeiden, sollte Ihr Programm die Funktion setsockopt mit den Parametern SO_REUSEADDR und SO_RCVTIMEO verwenden:
quelle
Wir hatten das gleiche Problem und haben Process Explorer von Microsoft Sysinternals verwendet, um die nicht mehr vorhandene Prozess-ID zu ermitteln.
Es stellte sich heraus, dass der Prozess von mehreren DrWatson-Prozessen referenziert wurde. Durch das Beenden dieser Prozesse wurde der Port freigegeben. DrWatson wird zum Senden von Speicherabbildern an Microsoft verwendet. Dies dauerte mehrere Stunden, da der abgestürzte Prozess zu diesem Zeitpunkt mehrere zehn GB Speicher enthielt.
quelle
Ich denke, Sie sollten CurrPorts ausprobieren
quelle
Das wahrscheinliche Problem ist, dass Ihr Prozess einen anderen (untergeordneten) Prozess gestartet hat, der das Socket-Handle geerbt hat und noch ausgeführt wird.
Es gibt verschiedene Möglichkeiten, dies zu verhindern, zum Beispiel: ProcessStartInfo.UseShellExecute = true;
quelle
subprocess.call(..., cwd=..., shell=True)
als App-Launcher auf einem Python-Webserver angerufen , und es stellte sich heraus, dass ich all diese untergeordneten Prozesse beenden musste, um den Socket freizugeben. Das Seltsame ist, dass ich shell = True verwende. Das hat mich ewig geärgert.Können Sie den Prozess im Prozess-Explorer sehen ? Wenn ja, können Sie es von dort aus töten, aber erst, nachdem Sie untersucht haben, was es tatsächlich ist (Sie können alle in den Prozess geladenen DLLs sehen).
quelle
Versuchen Sie, ein '-b'-Flag in Ihrem netstat-Befehl zu setzen. Es zeigt Ihnen den Namen der ausführbaren Datei an, die den Port verwendet. Dann finden Sie diesen Proc im Task-Manager und töten Sie ihn dort. Wenn das nicht funktioniert, wird der Port durch die ausführbare Datei offen gehalten.
quelle
Müssen hier den Begriff Verweilen erwähnen .
Details finden Sie unter http://msdn.microsoft.com/en-us/library/ms739165.aspx
Kurz gesagt: Es gibt eine Option, die das Socketsystem anweist, einen Socket auch nach dem Schließen offen zu halten, wenn nicht gesendete Daten vorhanden sind.
In Ihrer C # -App können Sie alle zugehörigen Optionen über Socket.SetSocketOption angeben: http://msdn.microsoft.com/en-us/library/1011kecd.aspx
Da sich alle erwähnten Dinge auf das Senden und die Clients beziehen, wir jedoch ähnliche Probleme hatten, wurde bei einigen weiteren Suchen festgestellt, dass die Verweildaueroption für Listener wie im folgenden Beispiel angegeben werden kann: http://msdn.microsoft.com /library/system.net.sockets.tcplistener.server.aspx
Einige Kollegen sprachen über Ports, die vom Betriebssystem nach dem Beenden / Schließen der Anwendung für etwa zwei Minuten gehalten werden. In Anbetracht dessen wäre es interessant zu hören, ob der Hafen nach einer gewissen Zeit noch gehalten wird.
quelle
Ich stoße auch auf dieses Problem. Endlich habe ich meinen Grund gefunden. Es wird durch den Hauptprozess verursacht, der in c / c ++ durch das Öffnen eines untergeordneten Prozesses aufgerufen wird. Aber der Hauptprozess stürzt ab / fährt herunter, bevor pclose aufgerufen wird. Dann wird der Port den Hauptprozess noch live behandeln und noch darauf lauschen.
quelle
Ich hatte das gleiche Problem mit xdebug, es ließ Port 9000 offen.
Ich habe es geschafft, mit cmd mit "taskkill / pid xxxx" zu schließen.
Die PID des Prozesses, der den Port verwendet, kann mit "netstat -o" abgerufen werden.
Meine Konfiguration war Win 7 Home Premium.
quelle
Ich hatte das gleiche Problem und habe es behoben durch:
netstat -o
Interessanterweise kann netstat manchmal eine pid zurückgeben, jedoch nicht den entsprechenden Namen der ausführbaren Datei!
quelle
Das Problem kann verursacht werden, wenn der tote Prozess einen oder mehrere untergeordnete Prozesse gestartet hat. Wenn
Wurde zum Starten eines untergeordneten Prozesses verwendet, hängt dies vom Wert der Vererbungshandles ab, also mit
Windows blockiert den Port nicht, wenn der übergeordnete Prozess gestoppt ist und der Clientprozess noch ausgeführt wird.
quelle
Ein ähnliches Problem wurde festgestellt, als als die Hauptursache ein untergeordneter Prozess war, der die Ports erbte. Der übergeordnete Prozess stürzte ab, während der untergeordnete Prozess den Port noch hielt. Die Lösung bestand darin, den noch ausgeführten untergeordneten Prozess zu identifizieren und anzuhalten. In diesem Beispiel war die nicht vorhandene Prozess-PID 7336
So beenden Sie diesen Prozess:
Und das löste das Problem.
quelle
Ich nehme nicht an, dass Sie eine Firewall installiert haben (oder Windows-Netzwerkwochen ausprobiert haben)?
Einige Firewalls weisen dieses Verhalten auf und können Ports offen halten.
Wenn Sie eines haben, deaktivieren Sie es und starten Sie dann Ihr Programm, schließen Sie es und sehen Sie, was passiert.
quelle
Da Ihr Prozess als System aufgeführt ist, können Sie ihn höchstwahrscheinlich an einer Eingabeaufforderung "System" beenden. Das Systemkonto verfügt über mehr Berechtigungen als ein regulärer Administrator.
Sie können "System" cmd.exe erhalten, indem Sie einen Task für cmd.exe planen (der Scheduler wird als System ausgeführt):
Ändern Sie diese Zeit für etwas in naher Zukunft. Stellen Sie außerdem sicher, dass Sie sich auf der Computerkonsole befinden (wenn Sie sich in einer regulären Terminalserversitzung befinden, wird die neue Datei cmd.exe nicht angezeigt.
mstsc
Melden Sie sich bei der Konsole an.). Ich denke, es gibt andere Möglichkeiten, das zu tun, aber das hat in der Vergangenheit für mich funktioniert.quelle
Ich hatte das gleiche Problem. Der Prozess wurde debuggt, während er abstürzte, und es gab immer noch einen vsjitdebugger.exe-Prozess in einem angehaltenen Zustand, der offenbar auf den Prozess verwies, der debuggt wurde. Das Problem wurde durch das Beenden dieses vsjitdebugger.exe-Prozesses behoben.
quelle
Eine hybride Verwendung von TCPView und Process Explorer hat bei mir funktioniert;) Ich habe zuerst nach der Prozess-ID gesucht, die den Port in TCPView verwendet hat. Isolierte den Prozess im Prozess-Explorer und beendete ihn mit dem Prozess-Explorer.
quelle