DNS Client ohne gethostbyname(), getaddrinfo()

  • Themenstarter Themenstarter jimb0p
  • Beginndatum Beginndatum
J

jimb0p

Hallo,

ich möchte wie im Titel schon beschrieben einen DNS Client ohne gethostbyname(), getaddrinfo() schreiben. Das Programm soll mir den A-Record eines Domainnamens bei einem Nameserver abfragen und die Antwort dann einfach ausgeben. Wie genau sollte der Ablauf des Programms sein, damit ich den A-Record erhalte?

Schonmal Danke für jede Hilfe!
 
Hallo,

ich vermute mal, dass du einen DNSLookup meinst, den du machen willst. Hier auf der Seite, gibt es ein Beispielprogramm dafür.
Marco möchte aber ein Beispiel, dass nicht irgendwo get(Host)ByName macht ;-)

wenn du dir einen eigenen DNS Client schreiben möchtest musst du (zumindest wenn du dem Standard entsprechen möchtest) per UDP oder TCP an Port 53 (Standard DNS Port) ein entsprechendes Datenpaket an einen DNS Server (wie Beispielsweise 8.8.8.8 ein Standard DNS Server von google) senden.

Details zum DNS Protokoll findest du hier:
http://de.wikipedia.org/wiki/Domain_Name_System#Beispiel_Namensaufl.C3.B6sung
http://www.bind9.net/rfc
http://sourcedaddy.com/networking/dns-protocol.html

Btw. im JRE (im rt.jar findet man im Package com.sun.jndi.dns) eine Implementierung eines DNS Clients der wie oben beschrieben über UDP arbeitet. Dort kannst du dir abschauen wie man das konkret umsetzen kann, ggf. musst du dir das rt.jar mit JD Decompiler anschauen... http://java.decompiler.free.fr/)

Gruß Tom
 
Hallo und vielen Dank für die Hilfe. Ich habe bis jetzt folgenden Code hinbekommen:

Code:
import java.io.*;
import java.net.*;

public class DNSClient {
	
	private final static int DNS_PORT = 53; // Port laut RFC1035
	private final static int TIME_OUT = 0;
	private final static int PACKET_SIZE = 12;
	
	public static void main(String[] args) throws IOException{
		String NSIp = "134.91.78.131"; //IP von NS
		DatagramSocket sock = null;
        DatagramPacket packetSenden;
    	DatagramPacket packetEmpfangen;
    	byte[] datenSenden;
    	byte[] datenEmpfangen;
    	int i = 0;
    	datenSenden = new byte[PACKET_SIZE];
    	datenSenden[0] = 0;//
    	datenSenden[1] = 0;//ID
    	
    	datenSenden[2] = 0;
    	
    	datenSenden[3] = 0;
    	
    	datenSenden[4] = 0;//
    	datenSenden[5] = 0;//QDCOUNT
    	
    	datenSenden[6] = 0;//
    	datenSenden[7] = 0;//ANCOUNT
    	
    	datenSenden[8] = 0;//
    	datenSenden[9] = 0;//NSCOUNT
    	
    	datenSenden[10] = 0;//
    	datenSenden[11] = 0;//ARCOUNT
    	
    	try {
			sock = new DatagramSocket();
			sock.setSoTimeout(TIME_OUT);
			packetSenden = new DatagramPacket(datenSenden, datenSenden.length, InetAddress.getByName(NSIp), DNS_PORT);
			sock.send(packetSenden);
			
			System.out.println("Warte auf Rückmeldung...");
			packetEmpfangen = new DatagramPacket(new byte[PACKET_SIZE], PACKET_SIZE);
			sock.receive(packetEmpfangen); //auf Antwort warten
			datenEmpfangen = packetEmpfangen.getData();
			
			while (i < datenEmpfangen.length){
				System.out.println(datenEmpfangen[i]);
				i++;
			}
			
		} catch (SocketException e) {
			e.printStackTrace();
		}
        
	}
}

Ich habe mir dazu hier folgende Links noch angeschaut:

http://tools.ietf.org/html/rfc1035 - Abschnitt 4
http://www.ietf.org/rfc/rfc1034.txt - Abschnitt 6.2

Ich vermute viel muss nicht mehr hinzugefügt werden, sondern das Datenpaket richtig aufgebaut werden und die Antwort dann korrekt interpretiert werden, nur da hakt es bei mir noch. Wenn jemand noch ein Tipp hätte wäre ich sehr dankbar.
 
Zurück