Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi DNS und kein Ende TARecord (https://www.delphipraxis.net/62286-dns-und-kein-ende-tarecord.html)

john2000 2. Feb 2006 14:16


DNS und kein Ende TARecord
 
Hallo,

ich bin ein absoluter Delphi Anfänger. Jedoch möchte ich einen Hostnamen zu einer IP Adresse auflösen.
Dazu habe ich mir Indy 9.0 auf meine Delphi 7.0PE installiert.
Nun habe ich die Indy Demo für den DNS Resolver soweit wie möglich gekürzt. Stehe nun vor dem Problem eine Funktion zu entfernen deren Sinn ich nicht verstehe. hir mein Code:

Delphi-Quellcode:
begin

     LB_QueryType.ItemIndex := 0;
end;


function TDNS_Main.DNS_Perform_Query(Question: string;
  var Value: string): integer;
var
   DNS : TIdDNSResolver;
  //var RR , TResultRecord : string;
  function GetDetail(RR : TResultRecord) : string;
   begin
       Result := TARecord(RR).IPAddress;

   end;
begin
     DNS := TIdDNSResolver.Create(self);
     // Assign the IP address of the DNS which you want to query
     //(NSLOOKUP Command: >server 168.95.1.1)
     DNS.Host := '168.95.1.1';


      DNS.QueryRecords := [qtA];
      DNS.Active := True;
      DNS.Resolve(Question);
      Value := '';

      Value := Value + GetDetail(DNS.QueryResult.Items[0]);
     
//Value := Value + DNS.QueryResult.Items[0];
        //Value := Value + TARecord.IPAddress;



        Result := 0;

end;

procedure TDNS_Main.Btn_QueryClick(Sender: TObject);
var
   Back : string;
begin
     if (DNS_Perform_Query(Ed_Query.Text, Back) = 0 )then begin


             Memo_Result.Lines.Add(Back);

        end;
end;
Ich möchte die funktion GetDetail() einsparen weiß nich wirklich was diese macht. Irgndwie Umwandlung
TARecord in String ? Wie kann ich mit diesem Script einfach erreichen, das die IP in das Memo Feld eingetragen wird ?

Wie lautet der systax um einen tarecord in einen String zu verwandeln ?

Bitte um Hilfe.

MfG
Jens John glawion

john2000 2. Feb 2006 19:06

Re: DNS und kein Ende TARecord
 
Hallo zum 2. Mal,

meine erste Frage --> hat sich erledigt.

Habe es nun so:

Delphi-Quellcode:
procedure Btn_QueryClick(Sender: TObject);

  public

                           end;
var
  DNS_Main: TDNS_Main;

implementation

{$R *.DFM}
 procedure TDNS_Main.Btn_QueryClick(Sender: TObject);

var
   DNS : TIdDNSResolver;
   Question :string;
   Value:string;
   AR:TARecord;
   Back : string;
begin
    Question := Ed_Query.Text;
     DNS := TIdDNSResolver.Create(self);
     DNS.Host := '217.237.151.33';
     DNS.QueryRecords := [qtA];
      DNS.Active := True;
      DNS.Resolve(Question);
      Value := '';

     AR:=DNS.QueryResult.Items[0] as TARecord;
       Value := Value + AR.IPAddress;
                    back:=value;
             Memo_Result.Lines.Add(Back);

       end;


end.
Habe jetzt das Problem, das ich wenn ich www.google.de auflösen will einen Fehler bekomme:
Ungültige Typenumwandlung
Gebe ich aber www.glawion.de oder aber google.de ein dann erhalte ich ein korrektes Ergebniss.

Kann mir jemand sagen wo der Fehler liegt.


mfg
John2000

Basilikum 2. Feb 2006 19:17

Re: DNS und kein Ende TARecord
 
Google verwendet mehrere Canonical Names:
Code:
Query:
  Name: [url]www.google.de[/url]
  Record Type: Host-Address (A)
  Recursion desired: Yes

Requesting records... ok

Reply:
  Code: NoError
  Authoritative answer: No
  Truncation: No
  Recursion available: Yes
  Roundtrip delay: 206ms

  10 records:
    Answer:
      [CNAME] [url]www.google.de[/url] / TTL: 345600s (4 d 0:00:00 h)
        Canonical name = [url]www.google.com[/url]
      [CNAME] [url]www.google.com[/url] / TTL: 900s (0 d 0:15:00 h)
        Canonical name = [url]www.l.google.com[/url]
      [A] [url]www.l.google.com[/url] / TTL: 300s (0 d 0:05:00 h)
        Address = 66.249.93.99
      [A] [url]www.l.google.com[/url] / TTL: 300s (0 d 0:05:00 h)
        Address = 66.249.93.104
sprich DNS.QueryResult.Items[0] ist ein Objekt der Klasse TCNAMERecord (oder wie das Ding dann auch heisst) - ein Cast nach TARecord schlägt korrekterweise fehl....
als Workaround könntest du die Items ala "If Items[X] is TARecord Then Items[X] as TARecord" nach A-Records durchsuchen....

john2000 3. Feb 2006 09:13

Re: DNS und kein Ende TARecord
 
Hallo und Danke,

was mir jetzt noch unklar ist wie ich trotzdem zu der IP Adresse von Google komme. Ich habe nun versucht mit einer weiteren If Bedingung den Wert back (liefert bei www.google.de "h/B") abzufragen. Leider funktioniert das so nicht :|

Delphi-Quellcode:
  if( DNS.QueryResult.Items[0] is TARecord) then


      AR:=DNS.QueryResult.Items[0] as TARecord;
       Value := Value + AR.IPAddress;
        back:=value;
        if(back='h/B') then back:='Fehler';
      Memo_Result.Lines.Add(Back);
Ich möchte dann im folgenden prüfen ob die eingegebene Domain www. enthält dieses aud dem String entfernen und eine neue Anfrage (dann: google.de) starten.


Ich vermute das die If Abfrage nicht den entsprechenden Syntax hat. Aber wie gehts richtig ?

MfG
John2000

Basilikum 3. Feb 2006 09:59

Re: DNS und kein Ende TARecord
 
Zitat:

Zitat von john2000
Delphi-Quellcode:
  if( DNS.QueryResult.Items[0] is TARecord) then


      AR:=DNS.QueryResult.Items[0] as TARecord;
       Value := Value + AR.IPAddress;
        back:=value;
        if(back='h/B') then back:='Fehler';
      Memo_Result.Lines.Add(Back);

das ganze solltest du noch in eine Schlaufe packen.... z.B. so:
Delphi-Quellcode:
For X:=1 To DNS.QueryResult.Items.Count Do Begin
  if not (DNS.QueryResult.Items[X - 1] is TARecord) then Continue;

  AR:=DNS.QueryResult.Items[X - 1] as TARecord;
  If (Length(Value) > 0) Then Value:=Value + '; ';
  Value := Value + AR.IPAddress; // hier wären Trennzeichen noch praktisch (Zeile oberhalb)

// falls du nur eine IP brauchst:
  break;
end;
{
  das da muss jetzt anders gelöst werden:

  back:=value;
  if(back='h/B') then back:='Fehler';
  Memo_Result.Lines.Add(Back);
}

retnyg 3. Feb 2006 10:39

Re: DNS und kein Ende TARecord
 
Delphi-Quellcode:
uses winsock;

var
  WSAData: TWSAData;


function GetInAddr(host: string):TInAddr;
var h : PHostEnt;
begin
   result := TInAddr(inet_addr(pchar(host)));
   if cardinal(result) = INADDR_NONE then begin
      h := GetHostByName(pchar(host));
      if h <> nil then begin
        cardinal(result) := pcardinal(h^.h_addr_list^)^;
      end
      else
        cardinal(result) := 0;
   end;
end;

function GetIpAsString(host :string):string;
begin
  result := string(inet_ntoa(GetInAddr(host)));
end;


....

initialization
  if WSAStartUp($0101,WSAData) <> 0 then showmessage('could not load winsock');

finalization
  WSACleanUp;


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:08 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz