遇到 WinError 10013(访问权限不允许的套接字访问)时,通常是因为程序尝试绑定到受限制的端口(如 80、443 等)或系统权限不足。以下是分步解决方案:
1. 检查端口占用情况
目标:确认端口是否被其他进程占用。
# 在 PowerShell 或 CMD 中运行: | |
netstat -ano | findstr :<端口号> | |
# 例如检查 80 端口: | |
netstat -ano | findstr :80 |
-
如果发现占用端口的 PID(进程ID),用任务管理器结束该进程。
-
若需长期释放端口,可更换程序监听的端口(如改用 8080)。
2. 以管理员身份运行程序
原因:Windows 要求绑定 1024 以下端口需管理员权限。
-
右键点击程序/脚本 → 选择 以管理员身份运行。
-
如果是服务,需在服务管理器中设置 启动账户为管理员。
3. 修改端口权限(针对保留端口)
适用场景:必须使用 80、443 等保留端口。
# 以管理员身份运行 CMD/PowerShell: | |
netsh http add urlacl url=http://*:<端口号>/ user=Everyone | |
# 例如开放 80 端口: | |
netsh http add urlacl url=http://*:80/ user=Everyone |
4. 检查防火墙/杀毒软件
操作:
-
临时禁用防火墙或杀毒软件,测试是否解决问题。
-
若有效,需在防火墙中添加入站/出站规则允许程序通信。
5. 检查用户账户控制(UAC)设置
操作:
-
按
Win + R
输入msconfig
→ 进入 工具 → 禁用 更改 UAC 设置,重启后尝试。 -
或直接在控制面板中将 UAC 级别调低(不推荐长期使用)。
6. 检查程序代码(开发者适用)
代码层面:
-
确保程序未尝试绑定已关闭的套接字。
-
使用
try-except
捕获异常,并添加端口释放逻辑:import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 允许地址复用
s.bind(('0.0.0.0', 80))
7. 重启系统
原因:某些端口可能被系统进程短暂占用,重启后可能释放。
总结步骤
- 优先以管理员身份运行程序。
- 若无效,检查端口占用并终止冲突进程。
- 必须使用保留端口时,通过
netsh
修改权限。 - 最后排查防火墙/安全软件限制。
执行以上步骤后,问题通常可解决。若仍报错,请提供具体场景(如程序类型、端口号)以便进一步分析。