修复: ZeroTermux 下 _local_ip 拿不到局域网 IP (UDP广播被禁) -> 改连服务端地址选路由; 新手机 aria2 反向拉实测通过

This commit is contained in:
lou
2026-08-10 19:24:26 +08:00
parent 712d515f9c
commit 9f479f3103
3 changed files with 21 additions and 9 deletions
+1 -1
View File
@@ -8,7 +8,7 @@ dcb31e74e0a6ee8073337fc4fb2acf99 usr/share/7z-encrypt/config.py
21062e04f8c7f4471881a39c489dfa73 usr/share/7z-encrypt/metadata.py
3478ac8277b4b1a38694ad0cc8cdbcdb usr/share/7z-encrypt/splitter.py
b90b8c950f99e1439bc273f50a2ee0a6 usr/share/7z-encrypt/state.py
d5f5f2c428e022bf19d1d98bc7659d1a usr/share/7z-encrypt/transfer.py
795881c32c496161290920ae34bf74f1 usr/share/7z-encrypt/transfer.py
67d4b90265abf5a72af959f66679dd0f usr/share/7z-encrypt/tui.py
198943ad7a94f6ba0995cf2d326f66d4 usr/share/doc/7z-encrypt-client/changelog.gz
fadf3972cc61c7c76d0ccc20b29a804c usr/share/doc/7z-encrypt-client/copyright
+10 -4
View File
@@ -375,12 +375,16 @@ class TransferClient:
return httpd, pull_token
@staticmethod
def _local_ip() -> str:
"""局域网 IP: UDP connect 拿本地出口地址"""
def _local_ip(server_host: str) -> str:
"""局域网 IP: 连服务端地址选路由拿本地出口 IP (Android 禁 UDP 广播)
ZeroTermux/PRoot 下 UDP connect 到广播地址会 PermissionError,
改连真实服务端地址 (同网段) 取 getsockname。
"""
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
try:
s.connect(("10.255.255.255", 1))
s.connect((server_host, 1))
return s.getsockname()[0]
except OSError:
return "127.0.0.1"
@@ -393,10 +397,12 @@ class TransferClient:
成功返回 True; 服务端无 aria2/拉取失败返回 False (调用方回退逐卷 PUT)。
"""
import secrets
import urllib.parse as up
server_host = up.urlparse(self.base_url).hostname or "127.0.0.1"
httpd, pull_token = self._serve_chunks(
transfer_id, chunk_files, secrets.token_hex(8))
try:
base_url = f"http://{self._local_ip()}:{httpd.server_address[1]}"
base_url = f"http://{self._local_ip(server_host)}:{httpd.server_address[1]}"
code, payload = self._request(
"POST", f"/api/transfer/{transfer_id}/pull",
json_body={"base_url": base_url, "token": pull_token},
+10 -4
View File
@@ -375,12 +375,16 @@ class TransferClient:
return httpd, pull_token
@staticmethod
def _local_ip() -> str:
"""局域网 IP: UDP connect 拿本地出口地址"""
def _local_ip(server_host: str) -> str:
"""局域网 IP: 连服务端地址选路由拿本地出口 IP (Android 禁 UDP 广播)
ZeroTermux/PRoot 下 UDP connect 到广播地址会 PermissionError,
改连真实服务端地址 (同网段) 取 getsockname。
"""
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
try:
s.connect(("10.255.255.255", 1))
s.connect((server_host, 1))
return s.getsockname()[0]
except OSError:
return "127.0.0.1"
@@ -393,10 +397,12 @@ class TransferClient:
成功返回 True; 服务端无 aria2/拉取失败返回 False (调用方回退逐卷 PUT)。
"""
import secrets
import urllib.parse as up
server_host = up.urlparse(self.base_url).hostname or "127.0.0.1"
httpd, pull_token = self._serve_chunks(
transfer_id, chunk_files, secrets.token_hex(8))
try:
base_url = f"http://{self._local_ip()}:{httpd.server_address[1]}"
base_url = f"http://{self._local_ip(server_host)}:{httpd.server_address[1]}"
code, payload = self._request(
"POST", f"/api/transfer/{transfer_id}/pull",
json_body={"base_url": base_url, "token": pull_token},