运行Stem文档示例时Tor启动失败:无法绑定监听端口
解决Stem示例代码中
OSError: Process terminated: Failed to bind one of the listener ports错误 我之前也碰到过这个问题,这个错误本质是Tor进程没法绑定你指定的SOCKS端口,最常见的原因是目标端口已经被其他进程占用,下面给你几个靠谱的解决办法:
1. 检查并释放占用的端口
先确认你的7000端口是不是被其他程序占了:
- Windows系统:打开命令提示符,运行:
找到输出里的PID(最后一列数字),打开任务管理器,找到对应PID的进程并结束它。netstat -ano | findstr :7000 - Linux/macOS系统:打开终端,运行:
用lsof -i :7000 # 或者用netstat netstat -tulpn | grep :7000kill <PID>命令结束占用端口的进程(需要权限就加sudo)。
2. 更换未被占用的端口
如果不想折腾释放端口,直接换一个未被使用的端口就行,比如Tor默认的SOCKS端口9050,或者1080、8080这类常用端口。修改代码里的端口定义:
SOCKS_PORT = 9050 # 换成你确认未被占用的端口
3. 确保端口权限(针对低端口)
如果你非要用1024以下的端口(比如80、443),需要以管理员/root权限运行脚本,但不推荐这么做,尽量用1024以上的非特权端口,避免权限问题。
4. 其他排查点
- 暂时关闭防火墙试试,有些防火墙规则可能会阻止本地端口绑定;
- 更新Stem和Tor到最新版本,版本不兼容也可能导致奇怪的绑定问题:
同时去Tor官网下载最新的稳定版Tor客户端。pip install --upgrade stem
补全后的完整示例代码
你提供的代码里getaddrin没写完,这里给你补全正确的版本(以更换到9050端口为例):
import socks import socket import stem.process import urllib.request from stem.util import term SOCKS_PORT = 9050 # Set socks proxy and wrap the urllib module socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, '127.0.0.1', SOCKS_PORT) socket.socket = socks.socksocket # Perform DNS resolution through the socket def getaddrinfo(*args): return [(socket.AF_INET, socket.SOCK_STREAM, 6, '', (args[0], args[1]))] socket.getaddrinfo = getaddrinfo # Start Tor process def print_bootstrap_lines(line): if "Bootstrapped " in line: print(term.format(line, term.Color.BLUE)) try: stem.process.launch_tor_with_config( config = { 'SocksPort': str(SOCKS_PORT), 'ExitNodes': '{us}', }, init_msg_handler = print_bootstrap_lines, ) except stem.SocketError as e: print(f"Tor connection error: {e}")
内容的提问来源于stack exchange,提问作者Preston
相关产品推荐
相关产品推荐

