java - InetAddress 如何找到给定主机名的 IP?
问题描述
InetAddress 是如何工作的?它如何找到主机名的 IP 地址。
我知道我们可以在 Java 中使用 InetAddress 进行 DNS 解析,但我想知道它是如何工作的。它如何找到 DNS 服务器来解析地址?
我最近看到一个配置错误的cname
, InetAddress没有正确解决它。它间歇性地得到解决,但大多数时候都失败了。该dig
命令一直在同一台机器上成功。尽管在修复配置后,InetAddress
工作也始终如一。但我不明白为什么它之前间歇性地成功了。它应该一直失败或成功。
解决方案
如果您正在使用InetAddress.getByName(String)
,有几个因素会导致结果不一致:
- 它只返回调用的第一个地址
InetAddress.getAllByName(String)
, - 对同一地址的重复查询被缓存,即使是否定的结果,
- 如果查询不在缓存中,则将其转发到平台名称解析服务。对于Windows和Unix ,这会导致调用
getaddrinfo
.
此函数的作用是特定于平台的。在带有 glibc 的 Linux 上,这是通过gai.conf和nsswitch.conf 配置的。/etc/hosts
在回退到数据库之前,这会查阅许多数据库(几乎总是文件) dns
。您可以通过以下方式获得类似的结果:
getent hosts <host_name>
总而言之,您获得dig
的只是一长串步骤中的最后一个。
推荐阅读
- c# - 如何从单元格参考中获取索引?
- javascript - 如何通过突变动态添加状态属性
- java - 不同类同时处理对象列表的最佳方法是什么
- python - Rasa utter_message 将 json 转换为字符串
- apache-spark - 在 spark conf 中传递 kerberos 密钥表和主体
- sustainsys-saml2 - C# owin 实现
- python - 尝试访问 bert.variables 时出现 BERT 模块错误
- r - r中的函数选择随机变量
- c# - HttpClient.GetStreamAsync() 适用于 .NET Core 而不适用于 .NET Framework
- javascript - 如何使用状态/道具循环浏览一组图像?