誰かがWindowsのコマンドラインを介して単一の接続のためにTCPまたはUDPソケットを閉じる方法を知っていますか?
これについてグーグルで、私は何人かの人々が同じことを尋ねているのを見ました。しかし、答えはnetstatまたはnetshコマンドのマニュアルページのように見え、ポートの監視方法に焦点が当てられていました。それらを監視する方法についての回答は必要ありません(私はすでにこれをしています)。閉じたり殺したりしたいのですが。
明確にするために、編集:私のサーバーがTCPポート80をリッスンしているとしましょう。クライアントが接続を行い、それにポート56789が割り当てられます。それから、この接続は望ましくないことがわかりました(たとえば、このユーザーは悪いことをしています。停止するように求めましたが、接続が途中で切断されることはありません)。通常、仕事をするためにファイアウォールを追加しますが、これにはしばらく時間がかかり、緊急事態にありました。接続を所有しているプロセスを強制終了すると、サーバーがダウンするため、ここでは本当に悪い考えです。
はい、これは可能です。ソケットを閉じるために現在のプロセスである必要はありません。しばらくの間、リモートマシン、ネットワークカード、ネットワークケーブル、そしてあなたのOSがすべてソケットを閉じる原因となることを考えてみてください。
また、FiddlerとDesktop VPNソフトウェアは、自分自身をネットワークスタックに挿入して、すべてのトラフィックを表示したり、すべてのトラフィックを再ルーティングしたりすることができます。
ですから、本当に必要なのは、Windowsが直接これを可能にするAPIを提供するか、誰かがVPNやFiddlerのように動作してそれを通過するソケットを閉じる方法を提供するプログラムを作成することだけです。
これを正確に実行するプログラム( CurrPorts )が少なくとも1つあり、以前に開始したプロセスの特定のソケットを閉じる目的で今日使用しました。 CurrPortsが起動されました。これを行うには、もちろん管理者として実行する必要があります。
プログラムがポートをリッスンしないようにすることはおそらく容易に不可能であることに注意してください(まあ、それは可能ですがその能力はファイアウォールと呼ばれます...)、しかし私はここで尋ねられていないと思います。私の質問は "私のプログラムがリッスンしているポートへの1つのアクティブな接続(ソケット)をどのように選択的に閉じるのか?"ということです。望ましくない着信クライアント接続用のポート番号が与えられ、それが「ポート」と呼ばれていたため、質問の文言は少しずれていますが、リスニングポートではなくその1つのソケットへの参照であることは明らかです。
cmd
を開く
netstat -a -n -o
を入力
TCP [the IP address]:[port number] .... #[target_PID]#
を見つけます(UDPの同上)。
(ところで、kill [target_PID]
は私のために働きませんでした)
Ctrl + Alt + Delキーを押して[タスクマネージャの起動]を選択します。
「プロセス」タブをクリックしてください
[表示]> [列の選択]> [PID]のチェックボックスをオンにして、[PID]列を有効にします
興味のあるPIDを見つけて "END PROCESS"
これで、問題なく[IPアドレス]:[ポート番号]でサーバーを再実行できます。
たとえば、ポート8080を解放したいとします。その後、次のコマンドに従います。
完了しました。
あなたが解放したいポートを知っているなら、あなたはこのような特定のポートを探すことによってあなたのnetstatリストをソートすることができます:
netstat -ano | findstr :8080
それからpidはtaskkillで殺すことができる限界に現れます。
taskkill/pid 11704 /F
また、localhost専用のこの 質問 を見たいと思うかもしれませんが、私はそれが関連性があると思います:
Sysinternals/Microsoftツールのtcpview(gui)とTcpvcon(コマンドライン)を試してください。
TCPView( http://technet.Microsoft.com/ja-jp/sysinternals/bb897437.aspx )またはCurrPorts( http:// wwwを使用してください。 .nirsoft.net/utils/cports.html )。
別の方法として、外部ソフトウェアを使用したくない場合(これらのツールにはインストールは不要です)、まずnetstatコマンド(できればnetstat -b)を実行してから、ローカルセキュリティポリシーを設定してIPをブロックします。問題となっているユーザーのマシンのアドレス、それが私が望んでいない、あるいは未知の接続を使って行っていたものです。
ソケットを所有しているプロセスをシャットダウンせずにソケットを閉じることはできません。ソケットは、それらを開いたプロセスによって所有されています。 Unix/LinuxのプロセスID(PID)を調べます。以下のようにnetstatを使用してください。
netstat -a -n -p -l
それは次のように表示されます。
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1879/sendmail: acce
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 1860/xinetd
-aはすべてのソケットを表示し、-nはポート番号を示し、-pはPIDを示します。-lは待機しているものだけを表示します(これは、後に続くものによってはオプションです)。
あなたが欲しい本当の情報はPIDです。これで、そのプロセスをシャットダウンすることができます。
kill 1879
あなたがサービスをシャットダウンしている場合は、それを使用することをお勧めします:
service sendmail stop
キルは文字通りそのプロセスとそれが所有するすべての子供たちを殺します。 serviceコマンドを使用すると、init.dディレクトリに登録されているシャットダウンスクリプトが実行されます。サービスでkillを使用した場合は、正しくシャットダウンしなかったため、正しく起動しない可能性があります。サービス次第です。
残念ながら、この点でMacはLinux/Unixとは異なります。 netstatは使えません。 Macに興味があるならこのチュートリアルを読んでください。
http://www.tech-recipes.com/rx/227/find-out-which-process-is-holding-which-socket-open/
そしてあなたがWindowsを使っているならば、プロセスを殺すためにTaskManagerを使い、そしてサービスをシャットダウンするためにservices UIを使う。 PIDを識別するために、Linux/Unixと同じように、Windows上でnetstatを使用できます。
http://www.Microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/netstat.mspx?mfr=true
CurrPortsを使用してください(無料でインストールされていません): http://www.nirsoft.net/utils/cports.html
/close <Local Address> <Local Port> <Remote Address> <Remote Port> {Process Name}
例:
# Close all connections with remote port 80 and remote address 192.168.1.10:
/close * * 192.168.1.10 80
# Close all connections with remote port 80 (for all remote addresses):
/close * * * 80
# Close all connections to remote address 192.168.20.30:
/close * * 192.168.20.30 *
# Close all connections with local port 80:
/close * 80 * *
# Close all connections of Firefox with remote port 80:
/close * * * 80 firefox.exe
また、検索機能とフィルタ機能を備えたNice GUIもあります。
注:この回答は、huntharoとJasonXAの回答およびコメントをまとめたもので、読みやすくなっています。例はCurrPortsのWebページから来ています。
wkillcx は、言及されていないコマンドラインからTCP接続を切断するための信頼性の高いWindowsコマンドラインツールです。接続数が多いサーバーでは問題が発生することがあります。私は対話的なkillにtcpviewを使うことがありますが、wkillcxはスクリプトで使うことができます。
私はこれに対する正しい答えを見つけました。 Microsoftが所有するSysinternalsのTCPViewを試してください。あなたはそれを見つけることができます http://technet.Microsoft.com/ja-jp/sysinternals/bb897437
あなたはそれらのソケットを所有せずにあなたのサーバー上のソケットを閉じることはできません。そのため、サーバーソケットを所有するプロセスでコードを実行させずに実際にソケットを閉じることはできません。
ただし、クライアントにソケットを閉じるように指示する別の方法があります。クライアントが接続しているポートにRST TCPパケットを送信すると、クライアントは接続を切断します。あなたはnmapを使ってRSTスキャンでそれをすることができます。
ポートを閉じるには、このポートで待機しているプロセスを識別してこのプロセスを強制終了することができます。
あなたはsysinternalからtcpviewのようなプログラムを使用することができます。私はそれがあなたに不要な接続の監視と殺害の両方であなたを大いに助けることができると思います。
インスタント/実行可能/部分回答: https://stackoverflow.com/a/20130959/2584794
netstat -a -o -nが信じられないほどに使用されていた以前の回答とは異なり長いリストはそれらのポートを使用しているアプリケーションの名前なしで調べられることになっていました