SocketException (10013): 以一种访问权限不允许的方式做了一个访问套接字的尝试。
异常

原因
WinNAT 服务占用了你试图绑定的端口
WinNAT的具体机制:
- 启用 Hyper-V(Hypervisor-Based Virtualization)、WSL2(Windows Subsystem for Linux 2) 或 Docker 后,WinNAT 会随机保留一段 TCP 端口范围(如 11359-11458)
- 这些被占用的端口并非被其他应用程序使用,而是被系统级服务预留
- 即使端口未被监听,普通应用程序也无法绑定,导致权限被拒绝的错误
Hyper-V本质:直接在 Windows 上创建和运行完整虚拟机(如 Linux、Windows Server)的技术。
WSL2本质:在 Windows 上运行轻量级 Linux 环境的技术,是 WSL 的升级版。
解决方法
1.临时解决方法重启WinNAT服务,让其释放端口重新分配
命令
# 以管理员身份运行
net stop winnat
net start winnat2.永久方案,排除特定端口
如果你需要长期使用某个端口(如 11434),可以将其从 WinNAT 的动态端口范围中永久排除
命令
# 1. 停止 WinNAT 服务
net stop winnat
# 2. 添加端口排除规则(以 11434 为例)
netsh interface ipv4 add excludedportrange protocol=tcp startport=11434 numberofports=1
# 3. 重新启动 WinNAT 服务
net start winnat
# 4. 验证排除是否成功(查看已经被征用的端口)
netsh interface ipv4 show excludedportrange protocol=tcp排除后,该端口会显示为 * 标记的管理端口排除,WinNAT 不会再占用它
关于WinNAT 选取端口
- Windows 中有一个「TCP 动态端口范围」,处在这个范围内的端口,有时候会被一些服务占用。在 Windows Vista(或 Windows Server 2008)之前,动态端口范围是 1025 到 5000;在 Windows Vista(或 Windows Server 2008)之后,新的默认起始端口为 49152,新的默认结束端口为 65535。
- 如果安装了 Hyper-V,那么 Hyper-V 会为容器宿主网络服务(Windows Container Host Networking Service)随机保留一些端口号使用。
查看Windows动态端口范围
# 查看Windows动态端口范围
netsh int ipv4 show dynamicport tcp正常情况下,Hyper-V 虽然会在「TCP 动态端口范围」中随机挑一些端口号保留(占用),不过保留的端口号普遍比较大,就算保留几百、几千个也影响不大。但是,Windows 自动更新有时会出错,导致这个范围的起始端口被重置为 1024……这可就麻烦了,一些常用端口动不动就因为被保留而无法使用了。
手动设置Windows动态端口范围
#手动设置动态端口保留范围
netsh int ipv4 set dynamic tcp start=49152 num=16384
netsh int ipv6 set dynamic tcp start=49152 num=16384WinNAT 预留端口触发可能的节点
- 电脑重启后首次启动虚拟化服务
- Docker 容器启动/停止
- WSL2 实例开启
- Hyper-V 虚拟机状态变化
- Visual Studio 调试器自身触发网络隔离(尤其是使用容器化调试时)