fix: SOCKS5 隧道修复 - 子线程事件循环兼容性
1. 去掉 asyncio.wait_for 包装 open_connection,改用直接调用 2. ConnectionHandler 增加 flask_app 参数,数据库操作使用 app context 3. InstanceManager 传递 flask_app 到 Socks5Server 4. 修复 _reply 中 writer.write 不需要 await 的问题 验证: - 直连测试: HTTP/1.1 200 OK (ifconfig.me) - 端口监听: 10800 正常工作
This commit is contained in:
+7
-4
@@ -31,9 +31,10 @@ class InstanceConfig:
|
||||
class Socks5Server:
|
||||
"""单个 SOCKS5 服务器的 asyncio 事件循环。"""
|
||||
|
||||
def __init__(self, config: InstanceConfig, user_service):
|
||||
def __init__(self, config: InstanceConfig, user_service, flask_app=None):
|
||||
self.config = config
|
||||
self.user_service = user_service
|
||||
self.flask_app = flask_app
|
||||
self.server = None
|
||||
self.loop = None
|
||||
self.thread = None
|
||||
@@ -94,6 +95,7 @@ class Socks5Server:
|
||||
self._active_connections += 1
|
||||
handler = ConnectionHandler(
|
||||
reader, writer, self.config, self.user_service,
|
||||
flask_app=self.flask_app,
|
||||
on_close_cb=self._on_connection_close
|
||||
)
|
||||
await handler.handle()
|
||||
@@ -113,8 +115,9 @@ import time # noqa: E402
|
||||
class InstanceManager:
|
||||
"""管理所有 SOCKS5 实例。"""
|
||||
|
||||
def __init__(self, user_service):
|
||||
def __init__(self, user_service, flask_app=None):
|
||||
self.user_service = user_service
|
||||
self.flask_app = flask_app
|
||||
self._instances = {} # name -> Socks5Server
|
||||
self._config_cache = {} # name -> InstanceConfig
|
||||
self._lock = threading.Lock()
|
||||
@@ -151,7 +154,7 @@ class InstanceManager:
|
||||
# 启动缺失的实例
|
||||
for name in current_names - running_names:
|
||||
cfg = self._config_cache[name]
|
||||
srv = Socks5Server(cfg, self.user_service)
|
||||
srv = Socks5Server(cfg, self.user_service, self.flask_app)
|
||||
srv.start()
|
||||
with self._lock:
|
||||
self._instances[name] = srv
|
||||
@@ -192,7 +195,7 @@ class InstanceManager:
|
||||
max_concurrent=inst.max_concurrent,
|
||||
)
|
||||
self._config_cache[inst.name] = cfg
|
||||
srv = Socks5Server(cfg, self.user_service)
|
||||
srv = Socks5Server(cfg, self.user_service, self.flask_app)
|
||||
srv.start()
|
||||
with self._lock:
|
||||
self._instances[inst.name] = srv
|
||||
|
||||
Reference in New Issue
Block a user