如何强制我的 Android 应用程序使用 ipv4 而不是 ipv6?

Tho*_*eis 7 android retrofit okhttp

在 ipv6 网络上使用 Retrofit + okhttp 发出 REST 请求时,我的应用程序遇到问题。连接到 IPv6 网络时,响应时间似乎非常长(每个请求大约 10 秒)。您能告诉我是否有任何方法可以限制该应用程序,使其优先考虑 ipv4 网络?我知道这可能会影响应用程序的可用性,但该应用程序适用于更受限制的环境,不适合公众。

Yur*_*mke 13

您可以设置自定义 Dns 实现,仅将 Dns.SYSTEM 结果过滤为 IPv4。

https://github.com/yschimke/okurl/blob/master/src/main/kotlin/com/baulsupp/okurl/network/DnsSelector.kt

class DnsSelector() : Dns {
  override fun lookup(hostname: String): List<InetAddress> {
    return Dns.SYSTEM.lookup(hostname).filter { Inet4Address::class.java.isInstance(it) }
  }
}
Run Code Online (Sandbox Code Playgroud)

然后设置它

  val client = OkHttpClient.Builder().dns(DnsSelector()).build()
Run Code Online (Sandbox Code Playgroud)

  • 相关:https://github.com/square/okhttp/issues/506#issuecomment-765899011 (2认同)
  • 实际上,一种更安全的方法是先按 IPV4 地址排序,然后再按 IPV6 地址排序,这样您就可以获得好处而不会出现问题。` class DnsSelector() : Dns { override fun Lookup(hostname: String): List&lt;InetAddress&gt; { return Dns.SYSTEM.lookup(hostname).sortedBy { Inet6Address::class.java.isInstance(it) } } } ` (2认同)