Windows 上 JetBrains 系列 IDE (IDEA, PyCharm, CLion) 启动失败, 提示 "Address already in use: bind"
主要问题是端口号被占用. 否则要修复被 Hyper-V 还原的 Windows 设置.

看到 “bind” 就可以想到是端口占用冲突相关的问题.

于是首先可以排除一些非常见的程序 (比如 qBittorrent 的随机端口, 某些自定义的 Web Server 等) 恰好占用到了 JetBrains IDE 需要用的端口的情况; 或者可以在 IDE 的日志 (如有) 中查看是否提到了具体的端口号, 然后根据端口号在资源管理器中查找对应的程序. 之后, 将这些程序停止, 再尝试是否能够启动 JetBrains IDE, 如果问题解决, 则说明是该程序的问题, 可以在下次运行时使用一个更高更随机的端口号 (比如 34567).

但是笔者懒, 于是简单进行一个搜索, 就发现很多提到 WSL 2 或者 Docker 的. ( 提到 Docker 是因为其在 Windows 平台上使用 WSL 2 作为实际运行的环境 )

这篇 IntelliJ 社区支持 的讨论中, 员工提到: 为了锁定 IDE 所在的文件夹, 其需要在本地主机上启动一个 Server, 并且选择 6942 至 6991 之间第一个可用的端口进行绑定, 如果失败 (没有可用的端口) 则会抛出异常; 如果这区间内 50 个端口都不可用, 则说明一些网络问题或者安全软件 (比如防火墙) 限制了 IDE 绑定到这些端口上. 此外, 可以使用 TcpView 工具来查看这些端口是否已被占用, 但如果是防火墙相关的问题, 那 TcpView 工具上并不会看到这些端口被占用. ( 笔者注: Windows 资源监视器也能查看应用程序使用的端口. )

接下来的讨论中有用户提到 Hyper-V 相关的问题, 进而就有用户找到相关的解决方案, 以及相关的一些文档:

根据 微软 “Windows 服务概述和网络端口” 的文档 中所说, 从 Windows Vista 之后, 保留的动态端口范围更改为了 49152 至 65535, 但是似乎是由于某些更新或者升级, 动态端口范围可能会被重设为 1024-65535 (可以使用管理员权限的 CMD 或者 PowerShell 执行 netsh int ipv4 show dynamic tcp 查看); 而某些 Hyper-V 服务将会在动态端口范围内保留一部分端口, 这就可能导致产生占用冲突.

因此, 如果发现确实出现了动态端口范围被重置的情况, 可以在具有管理员权限的命令提示符窗口下执行 (参考 这个 issue 下的回复):

netsh int ipv4 set dynamicport tcp start=49152 num=16383
netsh int ipv4 set dynamicport udp start=49152 num=16383
netsh int ipv6 set dynamicport tcp start=49152 num=16383
netsh int ipv6 set dynamicport udp start=49152 num=16383

之后, 可以尝试重启 winnat:

net stop winnat
net start winnat

同时, 如果开启了 Docker, 或者在 WSL 2 中运行了 Web Sever 并且在主机上通过 127.0.0.1:{端口号} 正在访问该程序, 记得关闭它们 ( 最好是重启计算机 ), 再启动 IDE, 一般来说问题便可解决. 笔者属于后一种情况: 出现问题时, 浏览器中正在访问 WSL 2 上运行着的一个 Web 程序, 关闭 WSL 2 和浏览器标签页后问题解决.

总的来看, 出现这种情况的原因更有可能是巧合, 但为了避免问题再次出现, 如果端口范围被重置回了 1025-65535,则建议恢复设置, 并重启计算机.


Last modified on 2023-01-19