Получить DNS SRV-запись, используя JNDI

Я пытаюсь получить записи SRV с DNS-сервера, используя JNDI.

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 недоступен]; оставшееся имя "_sip._udp"

Я подтвердил, что хост -t srv _sip._udp.server.com возвращает действительную запись SRV.

Есть причина, почему это может произойти?

1 ответ

Решение

Одно из следующего: dns.server.com не является действительным DNS-сервером, не имеет записи SRV для _sip._udpслужба DNS не отвечает на порт 53 (стандартный порт DNS) или ваш код Java неверен.

Чтобы диагностировать проблемы DNS-сервера, вы можете попробовать host -t SRV _sip._udp.server.com dns.server.com или же dig @dns.server.com -t SRV _sip._udp.server.com подтвердить, что сервер работает.

Если host или же dig верните ожидаемую запись, попробуйте следующие изменения в вашем коде:

Изменить:

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;
Другие вопросы по тегам