Hyper-V 或 Docker 占用端口导致 Jetbrain IDE 无法启动或 Clash 端口为 0
本文最后更新于:2023年5月26日 晚上
其实本文应该是:
- IDEA Start Failed: Address already in use 的解决办法
- Clash 端口为 0 的解决办法
问题描述
最近遇到了两次端口无法使用的问题,第一次是 Pycharm 无法启动。报错如下图,第二次是 Clash 无法使用默认端口 7890 从而变成端口 0 ,但实际上 0 并不是一个合法的端口,所以最终会导致代理无法使用。
发现两个问题的根源都是同一个。就是 tcp 动态端口占用某个区间,而我们需要的端口比如 7890 刚好在这个区间范围内。
问题排查
先打开 powershell
或者 cmd
查看端口占用:
1 |
|
查找某个端口是否被占用:
1 |
|
发现我们需要的端口明明没被占用啊。
然后查看 Windows 操作系统中 TCP 协议的动态端口范围:
1 |
|
使用命令查看被系统排除在可用范围外的端口:
1 |
|
也就是说在第一条命令范围的端口且不在第二条命令的范围的端口,是不可以用的。
Clash 问题解决
有几种方法都可以解决
修改软件的端口
山不动我动。既然 7890 被占用,那就换一个,比如说换成 7980
解决方法参考:《Clash For Windows代理端口为0问题》
修改 tcp 动态端口范围
看个人需求。你可以关掉,那就关。
先禁用 Hyper-V (需要重启)
1 |
|
重启完成后,增加被排除端口范围,其中 7890 就是希望被添加的排除在范围内的端口:
1 |
|
如果要保存的话,加上 store=persistant
也就是:
1 |
|
重新启用 Hyper-V
1 |
|
Jetbrains IDE 问题解决
其实我对于为什么会出问题还是有点迷思。
通过搜索我找到 JetBrains 论坛相关帖子
其中有一段:
To lock folders IDE is starting a server on localhost, it tries to bind on the first available port between 6942 and 6991
就是说 IDE 启动的时候会在本地起一个 server,并且绑定 6942 到 6991 之间第一个可用的端口。但明明这个段的端口是被排除了的。
我又查看了 tcp 实际占用的端口,在 Task Manager -> Performance -> Resource Monitor -> TCP connections
这个范围内确实没有使用端口。
但很多人都反映卸载 docker 和 Hyper-V 就可以重新启动 IDE 了。所以很明显这俩还是罪魁祸首
解决
以管理员身份运行 powershell
1 |
|