2011-06-24 42 views
3

我想從使用JNDI的DNS服務器獲取SRV記錄。使用JNDI獲取DNS SRV記錄

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

但試圖讓我的屬性得到了以下異常時

DNS錯誤[根異常是 java.net.PortUnreachableException: ICMP端口不可達]。剩餘名稱 '_sip._udp'

我已經驗證主機-t SRV _sip._udp.server.com返回有效的SRV記錄。

爲什麼會發生這種情況的任何原因?

回答

4

下列其中一項:dns.server.com不是有效的DNS服務器,沒有_sip._udp的SRV記錄,DNS服務不響應端口53(標準DNS端口)或您的Java代碼錯誤。

要診斷DNS服務器故障,您可以嘗試使用host -t SRV _sip._udp.server.com dns.server.comdig @dns.server.com -t SRV _sip._udp.server.com來確認服務器是否正常工作。

如果host或返回預期的條目,請嘗試以下更改代碼:

變化:

env.put("java.naming.provider.url", "dns://dns.server.com"); 

要:

env.put("java.naming.provider.url", "dns:"); 

(即只使用您的操作系統的標準DNS解析)

更改:

ctx.getAttributes("_sip._udp", new String [] { "SRV" }); 

要:

ctx.getAttributes("_sip._udp.domain.com", new String [] { "SRV" }); 

爲SRV記錄需要域名進行搜索,所以你結束:

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("_sip._udp.domain.com", new String [] { "SRV" }); 
return attributes;