一、通用方法
经常,我们在启动应用的时候发现系统需要的端口被别的程序占用,笔者在最近使用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 }
另外,大家在关闭进程的时候要慎之又慎,免得关闭了一些不必要的进程,造成严重的后果。