Home » Tutorials » Netzwerk und Internet » Indy

Indy

DNS (TIdDNSResolver)

DNS allgemein

Jeder Server, der über das Internet erreichbar sein will, benötigt eine eindeutige IP-Adresse. Eine IP-Adresse (IPv4) besteht aus vier durch Punkte getrennte Zahlen (z.B. 127.0.0.1 für den eigenen Rechner). Da Menschen sich solche Adressen im Allgemeinen nicht so gut merken können, wurden symbolische Namen eingeführt (z.B. delphi-treff.de), die eine spezielle IP-Adresse repräsentieren. Die TCP/IP-Verbindung funktioniert jedoch nach wie vor nur über IP-Adressen. Will ein Benutzer also per Browser eine Verbindung zu delphi-treff.de aufbauen, muss sich der Browser zuerst an einen Name Server wenden, um anzufragen, welcher IP-Adresse dieser symbolische Name entspricht. Kennt der Name Server die Antwort, gibt er sie zurück; ansonsten fragt er einen weiteren Name Server um Rat. Handelt es sich dabei um einen übergeordneten Name Server, der z.B. für alle de-Domains Bescheid wissen müsste, die gesuchte Adresse jedoch nicht kennt, so gibt der Browser dem Benutzer aus, dass diese Adresse nicht existiert. Alle Name Server sind Teil der verteilten DNS-Datenbank. DNS steht für Domain Name Service, der 1986 entstanden ist. Damit ist auch der Aufbau der symbolischen Adressen in Top Level Domains (de, com usw.) und alle Unterdomänen geregelt.
Die Aufgabe eines DNS-Resolver ist es, eine symbolische Internet-Adresse in eine IP-Adresse umzuwandeln.
Alle Internet-Standards sind in sog. RFC (Request For Comment)-Prozessen ausgearbeitet worden.
Für DNS gelten folgende RFC-Dokumente:

IdDNSResolver

Mit Hilfe der Komponente IdDNSResolver können wir selbst eine Anwendung schreiben, die Domain-Namen in IP-Adressen übersetzt. Dafür basteln wir uns eine Oberfläche, die etwa wie folgt aussieht:


Der Code zum Starten einer DNS-Namensauflösung sieht im Großen und Ganzen so aus:

  Memo1.Clear;
  IdDNSResolver.Host := edDNS.Text;
  IdDNSResolver.WaitingTime := StrToInt(EdTimeOut.Text);
  IdDNSResolver.ClearInternalQuery;
  IdDNSResolver.QueryType := [TQueryRecordTypes.qtSOA];
  IdDNSResolver.Resolve(Edit3.Text);

  for count := 0 to IdDNSResolver.QueryResult.count - 1 do
  begin
    Memo1.Lines.Add(GetDetail(IdDNSResolver.QueryResult.Items[count]));
  end;

Es werden also die Eigenschaften, WaitingTime und Host eines DNS-Servers gesetzt und anschließend die Methode Resolve aufgerufen. Der QueryType gibt dabei an, welche Informationen abgefragt werden sollen. qtSOA liefert dabei eine umfangreiche Liste, während z.B. qtA alleine die IP-Adresse zurück gibt.
Die Antwort des DNS-Servers befindet sich anschließend in der Eigenschaft QueryResult der IdDNSResolver-Komponente. Dieser Text wird nun formatiert ausgegeben.
Eine DNS-Anfrage ist natürlich nur möglich, wenn man auch einen DNS-Server kennt, an den man sich wenden kann. Im Internet sind eine ganze Reihe frei nutzbarer DNS-Server zu finden. Google bietet selbst auch welche an, z.B. unter der IP 8.8.8.8.

Download Demo-Code