Windows遇到端口占用问题简直就是家常便饭,比如:

  • V2ray端口被占用:

failed to listen on address: 127.0.0.1:1087 > listen tcp 127.0.0.1:1087: bind: address already in use
  • Alist端口被占用:

failed to start: listen tcp 0.0.0.0:5244: bind: An attempt was made to access a socket in a way forbidden by its access permissions.

在此记录一些常见的原因与解决方案。

一、端口被其他程序占用

这是百度营销号最喜欢说的原因,百度搜索Windows 端口占用有80%的垃圾文都只说这个原因,但这是最不可能的原因。解决方案:

1. 查询端口占用

运行命令

netstat –ano|findstr 端口号

如果查询Alist常占用的5244端口,会输出:

TCP    0.0.0.0:5244           0.0.0.0:0              LISTENING       14552
TCP    [::]:5244              [::]:0                 LISTENING       14552

判断到占用5244端口的程序的PID14552.

2. 查询PID对应的程序

  • 方法一:通过任务管理器查看:任务管理器-->进程-->PID,但有时候会因为程序折叠在主程序下,不展开主程序选项卡看不到子程序及其PID。

  • 方法二:运行命令

tasklist /FI "PID eq 14552"

输出:

映像名称                       PID 会话名              会话#       内存使用
========================= ======== ================ =========== ============
alist.exe                    14552 RDP-Tcp#1                  1     35,448 K

3. 将占用端口的程序杀掉

二、端口被系统保留

这是最常见的原因。

1. 查询端口保留范围

  • 查询TCP协议的动态端口范围

netsh int ipv4 show dynamicport tcp

Windows 系统在处理网络通信时,通常会使用动态端口,这些端口由系统动态分配。该命令允许你查看系统当前配置的 TCP 动态端口范围。

  • 查询Hyper-V占用的端口

netsh interface ipv4 show excludedportrange protocol=tcp

Hyper-V占用的端口包含于TCP协议的动态端口范围。

如果使用的端口在第二条命令的返回列表中,则端口不能正常工作。

注:查询Hyper-V占用的端口时,返回列表中带*的是手动阻止Hyper-V占用的端口。

2. 自定义TCP协议的动态端口范围(解决方法1)

由于Hyper-V占用的端口包含于TCP协议的动态端口范围,因此可通过该操作使Hyper-V不再占用所需的端口。

netsh int ipv4 set dynamicportrange tcp start=40000 num=15000

执行后重启系统。

注意,上述端口范围应当绕开需要使用的端口,此操作需要管理员权限。

3. 手动阻止Hyper-V占用相关端口(解决方法2)

假设5244是需要使用但被Hyper-V保留的端口,先停止Hyper-V

net stop winnat

然后执行:

netsh int ipv4 add excludedportrange protocol=tcp startport=5244 numberofports=1

然后恢复Hyper-V

net start winnat

此操作需要管理员权限。

三、部分参考资料

  1. 一文解决Windows端口占用、系统保留端口问题

  2. 记录一次Windows下端口占用但却找不到占用的进程的情况

  3. 一文解决windows电脑端口被占用问题,专治疑难杂症和port xxxx was already in use 说再见

  4. 解决 Windows 10 端口被 Hyper-V 随机保留(占用)的问题