解决报错“此端口已被占用”问题

在 Windows 系统使用一些软件的时候,经常会弹出“此端口已被占用”的报错,因而将这个问题在这里梳理一下。

这个问题一般来说有两个原因,一个是这个端口已经被某个应用使用,另一个原因是这个端口被系统保留了。

问题排查

首先,检查端口占用情况:

1
2
# powershell
netstat -ano | findstr "端口号"

如果有结果,就是被其他应用占用,会显示对应的 PID;否则的话,考虑是被系统保留了。

被其他应用占用

如果是被其他应用占用,直接 kill 就好:

1
taskkill /f /t /im PID

被系统保留

造成系统保留端口的原因比较多,其中一个就是 hyper-v 虚拟机开启或者打开了 WSL2 的原因。

首先,查看系统的保留端口列表:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 查看系统默认端口占用访问
netsh int ipv4 show dynamicport tcp
# 结果为:
协议 tcp 动态端口范围
---------------------------------
启动端口 : 1024
端口数 : 13977

# 查看hyper-v启动后的保留端口范围
netsh interface ipv4 show excludedportrange protocol=tcp
# 结果为:
协议 tcp 端口排除范围

开始端口 结束端口
---------- --------
1052 1151
1152 1251
1452 1551
1552 1651
1866 1965
3122 3221
3222 3321
3322 3421
3422 3521
3522 3621
3622 3721
3722 3821
5357 5357
14367 14466
14469 14568
50000 50059 *

如果使用的端口在上述列表中,则表明该端口是被保留了,解决办法如下:

设置保留端口确保不被占用

1
2
3
4
5
6
7
8
# powershell / cmd 管理员权限
# start 起始端口 num 表示可用端口数 按自己的需求来
netsh int ipv4 set dynamicport tcp start=30000 num=16383

# 排除ipv4动态端口占用 startport 起始端口 numberofports 端口数
netsh int ipv4 add excludedportrange protocol=tcp startport=5080 numberofports=1


PS:

已经被占用的端口无法被改动,需要先杀掉对应的进程。

改变应用使用的端口

选择系统保留端口列表之外的端口使用。