2011-06-29 112 views
0

例如,如果我在DNS配置定义了以下SRV记录JNDI DNS查找名称

_dev._tcp   IN  SRV  0  0  8400 dev.server.com. 

我可以执行以下命令

host -lt SRV server.com 

,这让我完整列表的DNS服务器(server.com)中的SRV记录。如果我想用JNDI查找来做同样的事情

Hashtable<String, String> env = new Hashtable<String, String>(); 
env.put("java.naming.factory.initial", "com.sun.jndi.dns.DnsContextFactory"); 
DirContext ctx = new InitialDirContext(env); 
Attributes attributes = ctx.getAttributes("server.com", new String [] { "SRV" }); 
return attributes; 

上面的代码没有返回任何属性。如果我将上述代码中的倒数第二行更改为此,

Attributes attributes = ctx.getAttributes("_dev._tcp.server.com", new String [] { "SRV" }); 

它的工作原理。

但问题是我不知道以前的完整域名,我必须查找SRV记录才能找到完整的域名。

任何想法如何做到这一点?

回答

2

-l参数/usr/bin/host指示DNS区域传送。与传统的DNS查询不同,区域传输通过TCP工作。

这里是host -lt SRV server.com做:

  1. 发现的server.com名称服务器。
  2. 使用TCP连接到第一个列出的名称服务器的端口53。
  3. 启动区域转移。
  4. 按照其-t srv过滤器过滤结果。

您需要通过JNDI启动区域传输,并筛选出您正在查找的结果。在DnsContext中调用DNS区域传输的方法是list()

NamingEnumeration<NameClassPair> names = ctx.list("server.com"); 

恕我直言,JNDI有一个可怕的界面。它被设计成非常通用的名称和目录服务,接口和DNS之间的机械和技术不匹配令人沮丧。

如果你正在寻找一个更务实,更易于使用和功能完整的DNS库,看看dnsjava项目在http://www.dnsjava.org

还要记住不是每一个DNS服务器允许来自不可信任主机的区域传输。即使LAN DNS服务器现在也不允许默认的区域传输。