Windows 端口监听失败

在监听端口过程中,经常会遇到这样的报错

10013: An attempt was made to access a socket in a way forbidden by its access permissions
[WinError 10013] 以一种访问权限不允许的方式做了一个访问套接字的尝试

通常,造成该问题的原因是端口占用,可以检查相应端口的进程并关闭。如,检查占用 1080 的应用

netstat -ano | findstr 1080

但是,很多时候下,会发现端口并未被占用,仍然报这个错误。这时大概率的原因是该端口被系统保留。

使用下面的命令,可以查看被保留的端口范围

> netsh int ipv4 show excludedportrange tcp

协议 tcp 端口排除范围

开始端口    结束端口
----------    --------
      1024        1281
      3945        4044
      4045        4144
      4145        4244
      5357        5357
      6070        6169
      6170        6269
      6270        6369
      6370        6469
      6470        6569
      6771        6870
      6871        6970
      6971        7070
      7071        7170
      7171        7270
      7571        7670
      7681        7780
      7781        7880
      7881        7980
      7981        8080
      8082        8181
      8182        8281
      8308        8407
      9001        9001
     50000       50059     *

* - 管理的端口排除。

如果相应的程序(大概率是 Hyper-V)没有运行,可以使用下面的程序把 1080~1090 范围从保留中去除

netsh int ipv4 add excludedportrange tcp 1080 10

如果 Hyper-V 在运行中,则可以分别使用下面的命令开关 Hyper-V,不过一般直接关闭 Hyper-V 重启后,程序会占用对应的端口,下次再启动就不会保留用到的端口了

dism.exe /Online /Disable-Feature:Microsoft-Hyper-V
dism.exe /Online /Enable-Feature:Microsoft-Hyper-V

也有人给出了如下方案:

netsh int ipv4 set dynamic tcp start=51001 num=5000
reg add HKLM\SYSTEM\CurrentControlSet\Services\hns\State /v EnableExcludedPortRange /d 0 /f
netsh int ipv4 show excludedportrange protocol=tcp

参考资料