3

我正在尝试使用 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 错误 [Root 异常是 java.net.PortUnreachableException: ICMP Port Unreachable];剩余名称'_sip._udp'

我已验证 host -t srv _sip._udp.server.com 返回有效的 SRV 记录。

为什么会发生这种情况?

4

1 回答 1

4

以下情况之一:dns.server.com不是有效的 DNS 服务器,没有 SRV 记录_sip._udp,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;
于 2011-06-24T21:57:59.817 回答