Commit b9828bfe authored by chenhuaqing's avatar chenhuaqing Committed by hanakeichen

fix test latency

parent 38f8993c
...@@ -34,5 +34,5 @@ class AccVpnService { ...@@ -34,5 +34,5 @@ class AccVpnService {
} }
interface TestLatencyCallback { interface TestLatencyCallback {
fun onLatency(latency: Int) fun onLatency(latency: Int): Boolean
} }
\ No newline at end of file
...@@ -17,8 +17,8 @@ object NetworkAdapter { ...@@ -17,8 +17,8 @@ object NetworkAdapter {
var wifiNetwork: Network? = null var wifiNetwork: Network? = null
var cellularNetwork: Network? = null var cellularNetwork: Network? = null
var bindNetwork: Network? = null
private var bindNetwork: Network? = null
private val FD_FIELD: Field private val FD_FIELD: Field
val wifiRequest: NetworkRequest = NetworkRequest.Builder() val wifiRequest: NetworkRequest = NetworkRequest.Builder()
......
package com.github.shadowsocks.bg package com.github.shadowsocks.bg
import android.net.Network import android.net.Network
import android.os.Build
import com.ccnet.acc.AccVpn import com.ccnet.acc.AccVpn
import com.ccnet.acc.NetworkAdapter import com.ccnet.acc.NetworkAdapter
import com.github.shadowsocks.Core import com.github.shadowsocks.Core
...@@ -10,7 +9,6 @@ import com.github.shadowsocks.database.ProfileManager ...@@ -10,7 +9,6 @@ import com.github.shadowsocks.database.ProfileManager
import com.github.shadowsocks.http.* import com.github.shadowsocks.http.*
import com.github.shadowsocks.preference.DataStore import com.github.shadowsocks.preference.DataStore
import com.google.gson.Gson import com.google.gson.Gson
import com.google.gson.JsonStreamParser
import com.google.gson.reflect.TypeToken import com.google.gson.reflect.TypeToken
import com.tencent.mmkv.MMKV import com.tencent.mmkv.MMKV
import kotlinx.coroutines.* import kotlinx.coroutines.*
...@@ -20,8 +18,8 @@ import okhttp3.Request ...@@ -20,8 +18,8 @@ import okhttp3.Request
import okhttp3.RequestBody import okhttp3.RequestBody
import okhttp3.RequestBody.Companion.toRequestBody import okhttp3.RequestBody.Companion.toRequestBody
import timber.log.Timber import timber.log.Timber
import java.io.File
import java.io.IOException import java.io.IOException
import java.net.InetAddress
import java.net.InetSocketAddress import java.net.InetSocketAddress
import java.net.Socket import java.net.Socket
import java.security.SecureRandom import java.security.SecureRandom
...@@ -39,7 +37,7 @@ object AuthManager { ...@@ -39,7 +37,7 @@ object AuthManager {
var scheduleAtFixedRate: ScheduledFuture<*>? = null var scheduleAtFixedRate: ScheduledFuture<*>? = null
var scheduleAtFixedRate1: ScheduledFuture<*>? = null var scheduleAtFixedRate1: ScheduledFuture<*>? = null
val okHttpClient: OkHttpClient private val okHttpClient: OkHttpClient
val gson: Gson val gson: Gson
val mmkv = MMKV.mmkvWithID("InterProcessKV", MMKV.MULTI_PROCESS_MODE) val mmkv = MMKV.mmkvWithID("InterProcessKV", MMKV.MULTI_PROCESS_MODE)
...@@ -126,7 +124,7 @@ object AuthManager { ...@@ -126,7 +124,7 @@ object AuthManager {
if (data.state != BaseService.State.Connected) { if (data.state != BaseService.State.Connected) {
return return
} }
NetworkAdapter.initNetworks(Core.deviceStorage) NetworkAdapter.initNetworks(Core.app)
scheduleAtFixedRate?.cancel(false) scheduleAtFixedRate?.cancel(false)
var failedCount: Int = 0 var failedCount: Int = 0
scheduleAtFixedRate = executor.scheduleAtFixedRate({ scheduleAtFixedRate = executor.scheduleAtFixedRate({
...@@ -170,16 +168,18 @@ object AuthManager { ...@@ -170,16 +168,18 @@ object AuthManager {
val celavg = cellularLatencyList.average().toInt() val celavg = cellularLatencyList.average().toInt()
if (wifiavg > celavg && wifiavg > 200 && celavg != -1) { if (wifiavg > celavg && wifiavg > 200 && celavg != -1) {
NetworkAdapter.useCellular(Core.deviceStorage) NetworkAdapter.useCellular(Core.deviceStorage)
Timber.d("switch to cellular")
} else if (celavg > wifiavg && wifiavg != -1) { } else if (celavg > wifiavg && wifiavg != -1) {
NetworkAdapter.useWifi(Core.deviceStorage) NetworkAdapter.useWifi(Core.deviceStorage)
Timber.d("switch to wifi")
} }
wifiLatencyList.clear() wifiLatencyList.clear()
cellularLatencyList.clear() cellularLatencyList.clear()
} }
} }
}, },
20, 1,
20, 1,
TimeUnit.SECONDS TimeUnit.SECONDS
) )
} }
...@@ -240,9 +240,9 @@ object AuthManager { ...@@ -240,9 +240,9 @@ object AuthManager {
var loginAuthToken: String = "1" var loginAuthToken: String = "1"
val jsonType get() = "application/json; charset=utf-8".toMediaTypeOrNull() private val jsonType get() = "application/json; charset=utf-8".toMediaTypeOrNull()
inline fun <reified T> postSync( private inline fun <reified T> postSync(
url: String, url: String,
token: String?, token: String?,
params: Any params: Any
...@@ -282,7 +282,61 @@ object AuthManager { ...@@ -282,7 +282,61 @@ object AuthManager {
} }
return sslContext!!.socketFactory return AutoSwitchNetworkSocketFactory(sslContext!!.socketFactory)
}
private class AutoSwitchNetworkSocketFactory(private val delegate: SSLSocketFactory) : SSLSocketFactory() {
override fun createSocket(s: Socket?, host: String?, port: Int, autoClose: Boolean): Socket {
val bindNetwork = NetworkAdapter.bindNetwork
val createSocket = delegate.createSocket(s, host, port, autoClose)
bindNetwork?.bindSocket(createSocket)
return createSocket
}
override fun createSocket(host: String?, port: Int): Socket {
val bindNetwork = NetworkAdapter.bindNetwork
return if (bindNetwork != null) {
bindNetwork.socketFactory.createSocket(host, port)
} else {
delegate.createSocket(host, port)
}
}
override fun createSocket(host: String?, port: Int, localHost: InetAddress?, localPort: Int): Socket {
val bindNetwork = NetworkAdapter.bindNetwork
return if (bindNetwork != null) {
bindNetwork.socketFactory.createSocket(host, port, localHost, localPort)
} else {
delegate.createSocket(host, port, localHost, localPort)
}
}
override fun createSocket(host: InetAddress?, port: Int): Socket {
val bindNetwork = NetworkAdapter.bindNetwork
return if (bindNetwork != null) {
bindNetwork.socketFactory.createSocket(host, port)
} else {
delegate.createSocket(host, port)
}
}
override fun createSocket(address: InetAddress?, port: Int, localAddress: InetAddress?, localPort: Int): Socket {
val bindNetwork = NetworkAdapter.bindNetwork
return if (bindNetwork != null) {
bindNetwork.socketFactory.createSocket(address, port, localAddress, localPort)
} else {
delegate.createSocket(address, port, localAddress, localPort)
}
}
override fun getDefaultCipherSuites(): Array<String> {
return delegate.defaultCipherSuites
}
override fun getSupportedCipherSuites(): Array<String> {
return delegate.supportedCipherSuites
}
} }
private fun initTrustManager(): X509TrustManager { private fun initTrustManager(): X509TrustManager {
......
...@@ -23,6 +23,7 @@ package com.github.shadowsocks.bg ...@@ -23,6 +23,7 @@ package com.github.shadowsocks.bg
import android.net.LocalSocket import android.net.LocalSocket
import android.os.SystemClock import android.os.SystemClock
import com.ccnet.acc.AccVpnService import com.ccnet.acc.AccVpnService
import com.ccnet.acc.NetworkAdapter
import com.ccnet.acc.TestLatencyCallback import com.ccnet.acc.TestLatencyCallback
import com.github.shadowsocks.aidl.TrafficStats import com.github.shadowsocks.aidl.TrafficStats
import com.github.shadowsocks.database.ProfileManager import com.github.shadowsocks.database.ProfileManager
...@@ -72,6 +73,7 @@ class TrafficMonitor(statFile: File?) { ...@@ -72,6 +73,7 @@ class TrafficMonitor(statFile: File?) {
override fun run() { override fun run() {
Timber.d("TrafficMonitor-NativePing prepare test ${DataStore.pingAccHost}:${DataStore.pingAccPort}") Timber.d("TrafficMonitor-NativePing prepare test ${DataStore.pingAccHost}:${DataStore.pingAccPort}")
var bindNetwork = NetworkAdapter.bindNetwork
while (running) { while (running) {
val resultCode = AccVpnService.instance.testLatency( val resultCode = AccVpnService.instance.testLatency(
DataStore.pingProxyServer, DataStore.pingProxyServer,
...@@ -80,10 +82,15 @@ class TrafficMonitor(statFile: File?) { ...@@ -80,10 +82,15 @@ class TrafficMonitor(statFile: File?) {
DataStore.pingIntervalSec, DataStore.pingIntervalSec,
DataStore.pingTimeoutMillis, DataStore.pingTimeoutMillis,
object : TestLatencyCallback { object : TestLatencyCallback {
override fun onLatency(latency: Int) { override fun onLatency(latency: Int): Boolean {
Timber.d("TrafficMonitor-NativeTcpPing test ${current.latency}") Timber.d("TrafficMonitor-NativeTcpPing test ${current.latency}")
current.latency = latency current.latency = latency
dirty = true dirty = true
val cont = bindNetwork == NetworkAdapter.bindNetwork
if (!cont) {
bindNetwork = NetworkAdapter.bindNetwork
}
return cont
} }
} }
) )
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment