Windows端口不可用:Error:listen EACCES:permission denied 0.0.0.0:5200

当我使用 Windows 11 下的 VSCode 启动 Vue 项目时,出现以下报错:

1
2
3
4
5
6
7
8
ERROR  error when starting dev server:                                        
Error: listen EACCES: permission denied 0.0.0.0:5200
at Server.setupListenHandle [as _listen2] (node:net:1800:21)
at listenInCluster (node:net:1865:12)
at doListen (node:net:2014:7)
at process.processTicksAndRejections (node:internal/process/task_queues:83:21)

 ELIFECYCLE  Command failed with exit code 1

1.1 环境说明

  • VSCode:
1
2
3
4
5
6
7
8
9
Version: 1.85.1 (user setup)
Commit: 0ee08df0cf4527e40edc9aa28f4b5bd38bbff2b2
Date: 2023-12-13T09:49:37.021Z
Electron: 25.9.7
ElectronBuildId: 25551756
Chromium: 114.0.5735.289
Node.js: 18.15.0
V8: 11.4.183.29-electron.0
OS: Windows_NT x64 10.0.22621
  • Windows 11
1
2
3
4
版本 Windows 11 专业版
版本 22H2
安装日期 ‎2022-‎10-‎07
操作系统版本 22621.2861

1.2 解决方案

在 Windows 中,某些端口范围可能被系统保留用于特定服务,例如动态端口分配给 Hyper-V 虚拟机、Windows 更新服务、或其他网络服务。这个分配的行为是动态、随机的,所以会出现用的好好的,但突然不可用的情况

我们可以通过以下命令查看哪些端口被动态分配了:

1
2
# 在 cmd 窗口中执行
netsh interface ipv4 show excludedportrange protocol=tcp

image.png

该命令会列出 TCP 协议下被排除的、不能被使用的端口范围。

netsh(网络壳层)是 Windows 提供的一个脚本化的命令行工具,用于本地或远程配置网络设备。

这个命令在网络故障排除中非常有用,特别是当我们遇到如下情况时:

  • 试图启动服务或监听特定端口时出现问题。
  • 确认系统是否有端口范围被 Hyper-V、Windows 更新或其他服务预留。
  • 解决端口冲突问题。

通常很难直接确定这些端口范围被保留的具体原因,因为 netsh 不提供这些信息。

知道哪些端口无法使用后,通过 vite --port [avaiable_port] 指定可用端口重启即可,例如:vite --port 8080

1.2.1 排除指定网段

除了上面指定可用的端口外,我们还可以将某个指定网段排除,使得该网段不会被系统动态分配,这样我们就不用担心我们要用的端口不可用。

使用 netsh 命令排除端口范围

  1. 打开命令提示符(以管理员身份)。

  2. 使用 netsh 命令设置动态端口范围。例如,如果想保留 5000-5100 范围的端口,可以先查看当前的动态端口范围:

    1
    2
    netsh int ipv4 show dynamicport tcp 
    netsh int ipv4 show dynamicport udp
  3. 设置新的动态端口范围,排除想保留的端口。例如,一般 tcp 动态端口默认范围是 1024-15000,而 UDP 动态端口默认范围是 49152-65535,我们可以调整 tcp 的动态端口范围为 35175-49151

    1
    netsh int ipv4 set dynamicport tcp start=35175 num=13977

    这里,num 参数是端口数量,计算方式为 end_port - start_port + 1。确保新的范围覆盖了原来的范围,同时绕过了想保留的端口。

  4. 重新启动计算机以应用更改。