android - 如何从 Java 程序中找到 Android 中的 DNS 服务器?

标签 android dns java

java.net.InetAddress.GetByName(String host) 方法只能返回 A 记录,因此要查找其他记录类型,我需要能够发送 DNS 查询使用 dnsjava 库。

但是,这通常依赖于能够解析 /etc/resolv.conf 或类似内容来查找 DNS 服务器地址,而这在 Android 上不起作用。

Android 上当前的 DNS 设置显然只能通过使用 getprop 命令从 shell 中获取。

除了使用 Runtime.exec() 生成 shell 并解析 getprop 的输出之外,谁能告诉我如何从 Java 中获取这些设置?

最佳答案

DNS protocol不是那么复杂 - 你不能只使用原始套接字(TCP 或 UDP)进行 DNS 访问吗?快速浏览一下 dnsjava 文档后,它似乎提供了低级 DNS 支持来帮助解决这个问题。

另一个可能的方向是,从dnsjava开始,去除对/etc/resolv.conf的依赖。我会考虑在您的启动脚本中使用 getprop 来设置 JVM 中的属性,或者在您的应用程序目录中创建一个本地化的 resolv.conf 文件,您可以从中读取所需的信息。换句话说,使用 getprop 将信息注入(inject) JVM,而不是在 JVM 运行后尝试将其拉入。当然创建一个 dnsjava 可以直接使用的文件应该是可行的。


编辑 - android.net

看起来 android.net.ConnectivityManager 将使用 getAllNetworkInfo() 为您提供一个 NetworkInfo 数组。然后使用 android.net.NetworkUtils.runDhcp() 为任何给定的网络接口(interface)获取 DhcpInfo - DhcpInfo 结构的 IP 地址为该接口(interface)的 dns1 和 dns2。令人惊讶的是 DNS 是 int,因此仅暗示 IP4。

关于android - 如何从 Java 程序中找到 Android 中的 DNS 服务器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/249916/

相关文章:

android - 让 Flutter 应用程序接受传入的 Intent

dns - 我的网络服务器可以位于一家托管公司,而我的电子邮件由第三方托管吗?

linux - 使用 GREP 并返回以下文本。 (DNS 查找)

seo - 将静态文件移出域是否意味着移出 html 目录?

Java ImageIO IIOException : Unsupported image type?

java - Android TCP 服务器限制

java - android 2.2 与 android v4.2 中的一个代码和不同的结果

java - 修改或生成Android resources.arsc和编译 list

java - 使用 Java 对象作为 Clojure 映射

java - Android RecyclerView DiffUtil.Callback : areContentsTheSame() and getChangePayload() giving different comparison results