windows下端口占用處理工具
一、通用方法
經常,我們在啟動應用的時候發現系統需要的端口被別的程序占用,筆者在最近使用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: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: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
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下端口占用處理工具