Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Querying the DNS service records to find the hostname and TCP/IP

In a paper about the Life Science Identifiers (see LSID Tester, a tool for testing Life Science Identifier resolution services), Dr Roderic DM Page wrote :

Given the LSID urn:lsid**:ubio.org**:namebank:11815, querying the DNS for the SRV record for _lsid._tcp.ubio.org returns animalia.ubio.org:80 as the location of the ubio.org LSID service.

I learned that I can link _lsid._tcp.ubio.org to animalia.ubio.org:80 using the host command on unix:

host -t srv _lsid._tcp.ubio.org
_lsid._tcp.ubio.org has SRV record 1 0 80 ANIMALIA.ubio.org

How can I do this 'DNS' thing using the Java J2SE API (Without any external java library, I'd like a lightweight solution ) ?

Thank you

like image 940
Pierre Avatar asked Apr 10 '09 20:04

Pierre


2 Answers

The JNDI DNS provider can lookup SRV records. You need to do something like:

Hashtable env = new Hashtable();
env.put("java.naming.factory.initial", "com.sun.jndi.dns.DnsContextFactory");
env.put("java.naming.provider.url", "dns:");
DirContext ctx = new InitialDirContext(env);
Attributes attrs = ctx.getAttributes("_lsid._tcp.ubio.org", new String[] { "SRV" });

The returned attributes are an enumeration of strings that look like "1 0 80 ANIMALIA.ubio.org". The space separated fields are in order:

  1. priority
  2. weight
  3. port
  4. server
like image 173
Dean Povey Avatar answered Oct 27 '22 01:10

Dean Povey


You can't do this using the standard Java libraries. The InetAddress class is only capable of looking up DNS A records.

To look up SRV records (and indeed any other DNS resource record type other than an A record) you need a third party library. dnsjava is the usual option.

I've personally used the 1.6 version on Google Android, it works fine. Version 2.0 and later use the Java nio layer, so won't be compatible with earlier JVMs.

like image 37
Alnitak Avatar answered Oct 26 '22 23:10

Alnitak