Получить 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;