使用JNDI获取DNS SRV记录

时间:2011-06-24 20:18:03

标签: java dns jndi 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记录。

为什么会出现这种情况的原因?

1 个答案:

答案 0 :(得分: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确认服务器是否正常工作。

如果hostdig返回预期的条目,请尝试对您的代码进行以下更改:

变化:

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;