2011-06-29 84 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服務器現在也不允許默認的區域傳輸。