From 8586c2550f3971479f2ce032f094069954f1d12f Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sat, 20 Jun 2026 12:32:26 +0800 Subject: [PATCH] feat: add TCPing pre-check to speed up real ping test --- .../com/v2ray/ang/handler/SpeedtestManager.kt | 33 ++++++++++++------- .../ang/service/RealPingWorkerService.kt | 20 +++++++++++ 2 files changed, 42 insertions(+), 11 deletions(-) diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/handler/SpeedtestManager.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/handler/SpeedtestManager.kt index 2cdc0b55..b8d64e4d 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/handler/SpeedtestManager.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/handler/SpeedtestManager.kt @@ -45,26 +45,37 @@ object SpeedtestManager { * @param port The port to connect to. * @return The connection time in milliseconds, or -1 if the connection failed. */ - fun socketConnectTime(url: String, port: Int): Long { + fun socketConnectTime(url: String, port: Int, timeoutMs: Int = 1500): Long { + var socket: Socket? = null + val start = System.currentTimeMillis() + try { - val socket = Socket() + socket = Socket() synchronized(this) { tcpTestingSockets.add(socket) } - val start = System.currentTimeMillis() - socket.connect(InetSocketAddress(url, port), 3000) - val time = System.currentTimeMillis() - start - synchronized(this) { - tcpTestingSockets.remove(socket) - } - socket.close() - return time + + socket.connect(InetSocketAddress(url, port), timeoutMs) + + return System.currentTimeMillis() - start } catch (e: UnknownHostException) { LogUtil.e(AppConfig.TAG, "Unknown host: $url", e) } catch (e: IOException) { - LogUtil.e(AppConfig.TAG, "socketConnectTime IOException: $e") + LogUtil.e(AppConfig.TAG, "socketConnectTime IOException: ${e.message}") } catch (e: Exception) { LogUtil.e(AppConfig.TAG, "Failed to establish socket connection to $url:$port", e) + } finally { + socket?.let { s -> + synchronized(this) { + tcpTestingSockets.remove(s) + } + try { + if (!s.isClosed) { + s.close() + } + } catch (closeEx: IOException) { + } + } } return -1 } diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/service/RealPingWorkerService.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/service/RealPingWorkerService.kt index 75118781..6790ac38 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/service/RealPingWorkerService.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/service/RealPingWorkerService.kt @@ -4,7 +4,12 @@ import android.content.Context import com.v2ray.ang.core.CoreConfigManager import com.v2ray.ang.core.CoreNativeManager import com.v2ray.ang.dto.RealPingEvent +import com.v2ray.ang.enums.EConfigType +import com.v2ray.ang.extension.isComplexType +import com.v2ray.ang.extension.isNotNullEmpty +import com.v2ray.ang.handler.MmkvManager import com.v2ray.ang.handler.SettingsManager +import com.v2ray.ang.handler.SpeedtestManager import kotlinx.coroutines.CancellationException import kotlinx.coroutines.CoroutineName import kotlinx.coroutines.CoroutineScope @@ -76,6 +81,21 @@ class RealPingWorkerService( private fun startRealPing(guid: String): Long { val retFailure = -1L + + val config = MmkvManager.decodeServerConfig(guid) ?: return retFailure + if (!config.configType.isComplexType() + && config.configType != EConfigType.HYSTERIA2 + && config.server.isNotNullEmpty() + && config.serverPort?.toIntOrNull() != null + ) { + val url = config.server.orEmpty() + val port = config.serverPort.orEmpty().toInt() + val tcpTime = SpeedtestManager.socketConnectTime(url, port, 1000) + if (tcpTime <= -1L) { + return retFailure + } + } + val configResult = CoreConfigManager.getV2rayConfig4Speedtest(context, guid) if (!configResult.status) { return retFailure