前端开发遇 3000 端口无权限访问且找不到占用该端口的程序

作者:Ake 发布于:2024年3月11日

问题

之前在写项目时发现前端开发常用的 3000 端口提示无权限访问,第一反应就是怀疑是不是被哪个程序占用了,使用netstat -ano命令查看后却并没有发现有哪个程序占用着 3000 端口,无奈只能重启试试,然后好了可以用了。

临时方案

最近又遇到了这个问题,但想了想也不能次次重启吧,毕竟打开开发要用的 IDE 和各种工具也挺费事的,所以在网上搜索了一番,发现可以通过重启 winnat 服务达到和重启电脑一样的效果,命令如下(需在管理员权限下运行)。

net stop winnat
net start winnat

但这个方法有时执行一次就有效,有时可能得多来两次才行。然后,经过又一番搜索终于找到了问题的根本原因。

根本原因

原来,Windows 中有一个“TCP 动态端口范围”,在这个范围内的端口有时候会被一些系统服务占用。使用如下命令可以查看目前的 TCP 动态端口范围。

netsh int ipv4 show dynamicport tcp

该范围中的端口不一定已经被占用了,只是说之后如果系统需要端口的话会从这个范围中去选择。

然后,如果电脑上安装了 Hyper-V,那么 Hyper-V 会为容器宿主网络服务(Windows Container Host Networking Service)在这个范围中随机保留一些端口号以供后续使用。要查看哪些端口被保留了可以使用如下命令。

netsh int ipv4 show excludedportrange protocol=tcp

这个范围中的端口就已经被占用了,如果去使用这个范围中的端口就会报开头遇到的错误。

解决方案

根本问题找到了,那解决方法就显而易见了,只要将 TCP 动态端口范围设置到平时基本用不到的范围中就可以了。设置 TCP 动态端口范围可以使用如下命令(需在管理员权限下运行)。

netsh int ipv4 set dynamic tcp start=50000 num=15536
netsh int ipv6 set dynamic tcp start=50000 num=15536

开始端口和保留数目可以根据自己情况自行调整,这里设置的端口范围为 50000~65535。然后重启电脑即可。