1. 程式人生 > >windows下端口占用處理工具

windows下端口占用處理工具

都是 spl fin .exe () 方法 技術 logs 不必要

一、通用方法

經常,我們在啟動應用的時候發現系統需要的端口被別的程序占用,筆者在最近使用tomcat時,老是會遇到這種端口占用的問題,如何知道誰占有了我們需要的端口,很多人都比較頭疼,以下是通用方法:

在windows命令行窗口下執行:

1.查看所有的端口占用情況

C:\>netstat -ano
協議 本地地址 外部地址 狀態 PID
TCP 127.0.0.1:1434 0.0.0.0:0 LISTENING 3236

TCP 127.0.0.1:5679 0.0.0.0:0 LISTENING 4168
TCP 127.0.0.1:7438 0.0.0.0:0 LISTENING 4168
TCP 127.0.0.1:8015 0.0.0.0:0 LISTENING 1456
TCP 192.168.3.230:139 0.0.0.0:0 LISTENING 4
TCP 192.168.3.230:1957 220.181.31.225:443 ESTABLISHED 3068
TCP 192.168.3.230:2020 183.62.96.189:1522 ESTABLISHED 1456
TCP 192.168.3.230:2927 117.79.91.18:80 ESTABLISHED 4732
TCP 192.168.3.230:2929 117.79.91.18:80 ESTABLISHED 4732
TCP 192.168.3.230:2930 117.79.91.18:80 ESTABLISHED 4732
TCP 192.168.3.230:2931 117.79.91.18:80 ESTABLISHED 4732
2.查看指定端口的占用情況
C:\>netstat -aon|findstr "9050"
協議 本地地址 外部地址 狀態 PID
TCP 127.0.0.1:9050 0.0.0.0:0 LISTENING 2016

P: 看到了嗎,端口被進程號為2016的進程占用,繼續執行下面命令: (也可以去任務管理器中查看pid對應的進程)

3.查看PID對應的進程
C:\>tasklist|findstr "2016"
映像名稱 PID 會話名 會話# 內存使用
========================= ======== ================
tor.exe 2016 Console 0 16,064 K

P:很清楚吧,tor占用了你的端口。
4.結束該進程

C:\>taskkill /f /t /im tor.exe

以上轉自:http://www.iteye.com/topic/1117270

二、描述與運行截圖

  盡管上述方法能夠解決這個問題,但是過於繁瑣,而且CMD下的那幾行命令實在難記住,筆者便寫了這個exe。這玩意的實現比較簡單,主要是調用了cstdlib庫中的system()函數,邏輯也十分的清楚。雖然比較簡單,但是感覺還是十分的實用,因此拿出來於大家分享。好吧,其實主要是給自己留個備份。

以下是筆者的運行截圖:

技術分享

  

三、源代碼

  以下是實現的源代碼(轉載請註明出處),一個需要註意的點是:windows 為所有進程和線程分配的 ID 都是 4 的倍數。

技術分享
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 /*
 5 #windows端口占用處理工具
 6 #作者:大大維
 7 #2017/6/23
 8 */
 9 using namespace std;
10 int main()
11 {
12     system("title windows端口占用處理工具");//設置cmd窗口標題
13     system("color 2B");
14     char cmd1[64]="netstat -aon|findstr \"";
15     char cmd2[64]="tasklist|findstr \"";
16     char cmd3[64]="taskkill /f /t /im ";
17     cout<<"請輸入被占用的端口號:"<<endl;
18     unsigned duankou=0;
19     cin>>duankou;
20     sprintf(cmd1,"%s%d\"",cmd1,duankou);
21     system(cmd1);
22 
23     // windows 為所有進程和線程分配的 ID 都是 4 的倍數
24     cout<<"請輸入端口占用進程的PID(最後一列),或者直接結束(輸入非4的倍數,如1)";
25     unsigned pid=1;
26     cin>>pid;
27     if(!(pid%4))
28     {
29         sprintf(cmd2,"%s%d\"",cmd2,pid);
30         system(cmd2);
31     }
32     else
33     {
34         return 0;
35     }
36     cout<<"你想結束這個進程嗎?(y or n)"<<endl;
37     char ch=n;
38     cin>>ch;
39     if(ch==y)
40     {
41         cout<<"請輸入進程名(第一列),或者直接結束(輸入0)"<<endl;
42         char jingchengming[16];
43         cin>>jingchengming;
44         if(ch!=0)
45         {
46             sprintf(cmd3,"%s%s",cmd3,jingchengming);
47             system(cmd3);
48             cout<<"已經結束了該進程"<<endl;
49         }
50     }
51     getchar();
52     return 0;
53 }
View Code

  另外,大家在關閉進程的時候要慎之又慎,免得關閉了一些不必要的進程,造成嚴重的後果。

windows下端口占用處理工具