fix(lite): report tun worker startup errors

This commit is contained in:
RoyirinRosmontis
2026-09-19 04:07:27 +08:00
parent 889dcb88e5
commit 2315735979
2 changed files with 25 additions and 15 deletions
+5 -3
View File
@@ -641,9 +641,11 @@ class TunBackend:
raise TunBackendError("自定义 DNS 不能为空") raise TunBackendError("自定义 DNS 不能为空")
try: try:
for item in cleaned: for item in cleaned:
socket.inet_pton(socket.AF_INET, item) address = ipaddress.ip_address(item)
except OSError as exc: if address.is_unspecified or address.is_multicast:
raise TunBackendError("当前 TUN 仅支持 IPv4 DNS 服务器") from exc raise ValueError(item)
except ValueError as exc:
raise TunBackendError("自定义 DNS 必须是有效的 IPv4/IPv6 地址") from exc
self._tun_dns_servers = cleaned[:3] self._tun_dns_servers = cleaned[:3]
engine = self.resolve_engine() engine = self.resolve_engine()
interface = self._physical_interface() interface = self._physical_interface()
+20 -12
View File
@@ -124,17 +124,22 @@ class TunModeController:
def _request(self, command: str, payload: dict[str, Any] | None = None) -> Any: def _request(self, command: str, payload: dict[str, Any] | None = None) -> Any:
if self._socket is None or self._reader is None: if self._socket is None or self._reader is None:
raise TunModeError("TUN 工作进程未连接") raise TunModeError("TUN 工作进程未连接")
_send(self._socket, {"command": command, "payload": payload or {}}) try:
while True: _send(self._socket, {"command": command, "payload": payload or {}})
message = _receive(self._reader) while True:
if message.get("type") == "log": message = _receive(self._reader)
self.log(str(message.get("message") or "")) if message.get("type") == "log":
continue self.log(str(message.get("message") or ""))
if message.get("type") != "result": continue
raise TunModeError("TUN 工作进程响应无效") if message.get("type") != "result":
if not message.get("ok"): raise TunModeError("TUN 工作进程响应无效")
raise TunModeError(str(message.get("error") or "TUN 操作失败")) if not message.get("ok"):
return message.get("value") raise TunModeError(str(message.get("error") or "TUN 操作失败"))
return message.get("value")
except TunModeError:
raise
except OSError as exc:
raise TunModeError(f"TUN 工作进程连接中止: {exc}") from exc
def status(self) -> dict[str, Any]: def status(self) -> dict[str, Any]:
with self._lock: with self._lock:
@@ -195,7 +200,6 @@ def run_tun_worker(port: int, token: str, backend_factory,
backend = None backend = None
try: try:
backend = backend_factory(emit)
while True: while True:
try: try:
request = _receive(reader) request = _receive(reader)
@@ -206,6 +210,10 @@ def run_tun_worker(port: int, token: str, backend_factory,
if command == "start": if command == "start":
if not isinstance(request.get("payload"), dict): if not isinstance(request.get("payload"), dict):
raise TunModeError("TUN 启动参数无效") raise TunModeError("TUN 启动参数无效")
# 延迟创建后端,使初始化失败也能通过控制协议返回具体原因,
# 避免 GUI 只看到 Windows 的 10053 连接中止错误。
if backend is None:
backend = backend_factory(emit)
start_backend(backend, request["payload"]) start_backend(backend, request["payload"])
value = None value = None
elif command == "stop": elif command == "stop":