Windows遇到端口占用问题简直就是家常便饭,比如:
V2ray端口被占用:
failed to listen on address: 127.0.0.1:1087 > listen tcp 127.0.0.1:1087: bind: address already in useAlist端口被占用:
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端口的程序的PID为14552.
2. 查询PID对应的程序
方法一:通过任务管理器查看:
任务管理器-->进程-->PID,但有时候会因为程序折叠在主程序下,不展开主程序选项卡看不到子程序及其PID。方法二:运行命令
tasklist /FI "PID eq 14552"输出:
映像名称 PID 会话名 会话# 内存使用
========================= ======== ================ =========== ============
alist.exe 14552 RDP-Tcp#1 1 35,448 K3. 将占用端口的程序杀掉
二、端口被系统保留
这是最常见的原因。
1. 查询端口保留范围
查询
TCP协议的动态端口范围
netsh int ipv4 show dynamicport tcpWindows 系统在处理网络通信时,通常会使用动态端口,这些端口由系统动态分配。该命令允许你查看系统当前配置的 TCP 动态端口范围。
查询
Hyper-V占用的端口
netsh interface ipv4 show excludedportrange protocol=tcpHyper-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此操作需要管理员权限。