私はポート3000でリスンするアプリを開発しています。どうやらまだポートを聞いているインスタンスがあるようで、起動するたびにポートがすでに取られているため、リスナー(C#、TcpListenerですが、それは関係ありません)を作成することができません
今、アプリはタスクマネージャに存在しないので、そのアプリのPIDを見つけて終了させようとしたところ、このような興味深い結果になりました
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.
前にこの行動を見たことがないが、誰か解決策を持っている人がいたら見てみたいと思うほど面白いと思った
UPDATE: プロセスエクスプローラーを立ち上げて3000で検索したら、これが出てきました
<Non-existent Process>(3000): 5552
右クリックして「ハンドルを閉じる」を選択しました。プロセスエクスプローラには表示されなくなりましたが、netstatにはまだ表示されていて、アプリがリスナーを起動するのを止めています
UPDATE 2: TCPView for Windowsを見つけました。CurrPortsと同様に、このツールで接続を閉じようとしても何も起こりません
52 Srekel 2010-11-26
ソケットでの無限の待ち時間を避けるために、プログラムは setsockopt 関数 に SO_REUSEADDR と SO_RCVTIMEO パラメータを指定して使用しなければなりません
SO_REUSEADDR : Allows the socket to be bound to an address that is already in use.
SO_RCVTIMEO : Sets the timeout, in milliseconds, for blocking receive calls.
14 harrymc 2010-11-29
同じ問題が発生し、Microsoft SysinternalsのProcess Explorerを使用して、存在しなくなったプロセスIDを調べました
そのプロセスはいくつかの DrWatson プロセスによって参照されていることがわかりました。それらのプロセスを殺すことでポートが解放されました。DrWatsonはMicrosoftにメモリダンプを送るために使われており、クラッシュしたプロセスは当時数十GBのメモリを保持していたため、これには数時間かかっていました
12 David 2012-07-26
おそらく問題は、あなたのプロセスがソケットハンドルを継承した別の(子)プロセスを起動していて、そのプロセスがまだ実行されていることです
これを防ぐための方法はいろいろあります。ProcessStartInfo.UseShellExecute = true;
8 Nick Westgate 2012-04-18
私はあなたがCurrPortsを試してみるべきだと思います
CurrPortsは、ローカルコンピュータ上で現在開いているすべてのTCP/IPおよびUDPポートのリストを表示するネットワーク監視ソフトウェアです。リスト内の各ポートについて、そのポートを開いたプロセスに関する情報も表示され、プロセス名、プロセスのフルパス、プロセスのバージョン情報(製品名、ファイルの説明など)、プロセスが作成された時間、プロセスを作成したユーザなどが表示されます
さらに、CurrPortsでは、不要なTCP接続を閉じたり、ポートを開いたプロセスを終了させたり、TCP/UDPポート情報をHTMLファイルやXMLファイル、タブ区切りのテキストファイルに保存したりすることができます
また、CurrPortsでは、正体不明のアプリケーション(バージョン情報やアイコンのないアプリケーション)が所有する不審なTCP/UDPポートをピンク色で自動的にマークしています
7 Sathyajith Bhat 2010-11-27
は、ポートを継承する子プロセスが作成され、親プロセスがクラッシュし、子プロセスがポートを保持したままになっていることが根本的な原因である場合に、同様の問題が発生しました。解決策は、まだ実行中の子プロセスを特定して停止させることでした。この例では、既存のプロセスではないプロセスのPIDは7336でした
> wmic process get processid,parentprocessid | findstr/i 7336
7336 23828
このプロセスを停止するには
> taskkill /f /pid 23828
そして、これで問題は解決しました
4 Michael 2018-02-11
私は上記のコメントのすべてのソリューションを試してみましたが、1つは私のために働いていませんでした。私は研究を続けてきたと私は@Michaelのコメントとこのリンクhttps://serverfault.com/questions/181015/how-do-you-free-up-a-port-being-held-open-by-dead-processを使用して組み合わせであるこの答えを得た
まず最初に、ポート番号を使って問題の原因となっているプロセスを見つける必要があります
netstat -abno | findstr /i "listening"| find ":3000" TCP 0.0.0.0:3000 0.0.0.0:0 LISTENING 3116
次に、@Michael のコードを使って親プロセス ID (ppid) を見つけなければなりません
wmic process get processid,parentprocessid | findstr/i 3116 3116 23828
次に、次のコードを使って子プロセスの ID を見つける必要があります
wmic process where (ParentProcessId=23828) get Caption,ProcessId Caption ProcessId wireguard.exe 27400
子プロセスから親プロセスまで、すべてのプロセスを終了させます
taskkill /f /pid 27400 taskkill /f /pid 3116 taskkill /f /pid 23828
これで問題は解決しました
4 kato2 2020-07-07
プロセスエクスプローラ でプロセスを見ることができますか?はいの場合は、そこからそれを殺すことができますが、それが実際に何であるかを調査した後でなければなりません(プロセスにロードされたすべてのdllを見ることができます)
1 Jakub Konecki 2010-11-26
netstat コマンドに ‘-b’ フラグをつけてみてください。ポートを使用している実行ファイルの名前を教えてくれます。タスクマネージャでその実行ファイルを見つけて、そこで kill してください。それでもうまくいかない場合は、ポートを開いている実行ファイルを投稿してください
1 Ge3ng 2010-11-30
ここでは長引くという言葉に言及する必要があります
詳細はhttp://msdn.microsoft.com/en-us/library/ms739165.aspxに掲載されています
簡単に説明するとソケットシステムには、未送信のデータがある場合、ソケットを閉じた後もソケットをオープンしておくように指示するオプションがあります
C#アプリでは、Socket.SetSocketOptionで関連するオプションを指定することができます。http://msdn.microsoft.com/en-us/library/1011kecd.aspx
ここで述べたことはすべて送信とクライアントに関連していますが、私たちは仕事で同様の問題を抱えていたので、さらに検索してみると、ここにある例のようにリスナーに linger オプションを指定することができることがわかりました。http://msdn.microsoft.com/library/system.net.sockets.tcplistener.server.aspx
同僚の中には、アプリケーションの終了/終了後、約2分間はOSがポートを保持しているという話をしていた人もいました。それを考えると、ある程度の時間が経過してもポートが保持されているかどうかを聞いてみるのも面白いかもしれません
1 Andreas 2010-12-01
私もこの問題に遭遇しました。ようやく原因がわかりました。原因は、c/c++のpopenでメインプロセスが子プロセスを起動したことにあります。しかし、メインプロセスは pclose を呼び出す前にクラッシュ/シャットダウンしてしまいます。そうすると、ポートはメインプロセスをまだ生きているとみなして、そのプロセスをリスンするようになります
1 lorry.lee 2012-07-16
この問題は、デッドプロセスが1つ以上の子プロセスを起動した場合に発生する可能性があります。もしもの場合
BOOL WINAPI CreateProcess(
_In_opt_ LPCTSTR lpApplicationName,
_Inout_opt_ LPTSTR lpCommandLine,
_In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes,
_In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,
_In_ BOOL bInheritHandles,
_In_ DWORD dwCreationFlags,
_In_opt_ LPVOID lpEnvironment,
_In_opt_ LPCTSTR lpCurrentDirectory,
_In_ LPSTARTUPINFO lpStartupInfo,
_Out_ LPPROCESS_INFORMATION lpProcessInformation
);
が子プロセスの起動に使用されていた場合、それは継承ハンドルの値に依存するので、 with
bInheritHandles = false
親プロセスが停止していて、クライアントプロセスがまだ実行中の場合、Windowsはポートをブロックしません
1 V15I0N 2015-06-16
ファイアウォールがインストールされていないのではないでしょうか?
ファイアウォールの中には、このような挙動を示すものがあり、ポートを開いたままにしておくことができます
もし持っている場合は、それを無効にしてからプログラムを起動して閉じてみて、何が起こるかを見てみてください
0 William Hilsum 2010-12-01
あなたのプロセスはシステムとしてリストアップされているので、ほとんどの場合、「システム」コマンドプロンプトで強制終了させることができます。システムアカウントは通常の管理者よりも多くの権限を持っています
cmd.exeのタスクをスケジューリングすることで、”System” cmd.exeを取得することができます(スケジューラはSystemとして実行されます)
at 15:23 /interactive "cmd.exe"
近い将来に何かのためにその時間を変更します。あなたがマシンコンソールにいることを確認してください(通常のターミナルサーバセッションにいる場合は、新しい cmd.exe が表示されません。コンソールにmstsc
ログインするようにしてください)。他にも方法があると思いますが、これは過去に私のために働いていました
0 David Suarez 2011-05-18
私は xdebug で同じ問題を抱えていました
taskkill /pid xxxx “を使ってcmdでなんとか閉じました
ポートを使用しているプロセスのpidは “netstat -o “で取得できます
私の設定はwin 7 home premiumでした
0 Christoforos 2013-01-04
私も同じ問題を抱えていました。プロセスがクラッシュしている間、プロセスはデバッグされていましたが、サスペンド状態の vsjitdebugger.exe プロセスがまだ存在しており、これは明らかにデバッグされているプロセスを参照していました。その vsjitdebugger.exe プロセスを削除することで問題は解決しました
0 gpvos 2014-04-03
私も同じ問題を抱えていたので、.NETで修正しました
netstat -o
でPIDを見つけることができます- プロセスxpで殺してください
netstat は pid を返すことはあっても、それに対応する実行ファイル名を返さないことがあることに注意してください!
0 eka808 2015-03-10
TCPViewとプロセスエクスプローラをハイブリッドに使うとうまくいきました。)最初にTCPViewでポートを使用しているプロセスIDを調べました。プロセスエクスプローラでプロセスを分離し、プロセスエクスプローラを使ってプロセスを終了させました
0 Sathiya Narayanan 2015-07-02