在 Windows 中,如果遇到端口无法正常使用的问题,首先会排查该端口是否被占用
netstat -aon | findstr 3200
大部分情况,都能定位到对应进程的 PID 号.
但有时候,上述指令找不到对应的进程,但端口的确是不能使用。
这个问题可能是 Windows 保留了某些端口,不让用户使用。可以使用下面的指令列出这些端口:
netsh interface ipv4 show excludedportrange protocol=tcp
Protocol tcp Port Exclusion Ranges
Start Port End Port
---------- --------
3131 3230
5357 5357
50000 50099 *
55500 55599
* - Administered port exclusions.
如果,我们的进程需要使用 3200 端口,就会报出下面的错误
ERROR error when starting dev server:
Error: listen EACCES: permission denied 127.0.0.1:3200
解决方法
大部分情况下,Windows 保留的端口是为 Hyper-V 准备的(也有其它的用途,例如 winnat 等,解决思路相同)。解决步骤就是先关闭 Hyper-V, 然后告诉系统保留我们需要的端口,然后再重启 Hyper-V.
1. 关闭 Hyper-V
三种方法:
方法 1 控制面板
- Programs and Features - Turn Windows features on or off - Uncheck the option Hyper-V -> 应用
方法 2 Powershell
Disable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-All
方法 3 cmd
dism.exe /Online /Disable-Feature: Microsoft-Hyper-V
重启系统
2. 保留端口
例如,我们需要使用 3200 端口
netsh int ipv4 add excludedportrange protocol=tcp startport=3200 numberofports=1
3. 重启 Hyper-V
跟步骤 1 相同,同样对应三种方法。
dism.exe /Online /Enable-Feature: Microsoft-Hyper-V /All
这时候,检查端口排除:
netsh int ipv4 show excludedport tcp
协议 tcp 端口排除范围
开始端口 结束端口
---------- --------
82 82
3200 3200 *
50000 50059 *
* - 管理的端口排除。
可以看出,3200 属于管理的端口排除,也就是说,用户可以使用的端口,Hyper-V 不会去占用这个端口。
如果,系统的端口保留不是因为Hyper-V,而是为了 winnat
, 可以使用 net stop winnat
等命令,用相同的思路解决。
网友评论