AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi DNS und kein Ende TARecord
Thema durchsuchen
Ansicht
Themen-Optionen

DNS und kein Ende TARecord

Ein Thema von john2000 · begonnen am 2. Feb 2006 · letzter Beitrag vom 3. Feb 2006
Antwort Antwort
Benutzerbild von john2000
john2000

Registriert seit: 2. Feb 2006
3 Beiträge
 
#1

DNS und kein Ende TARecord

  Alt 2. Feb 2006, 15:16
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
  Mit Zitat antworten Zitat
Benutzerbild von john2000
john2000

Registriert seit: 2. Feb 2006
3 Beiträge
 
#2

Re: DNS und kein Ende TARecord

  Alt 2. Feb 2006, 20:06
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
  Mit Zitat antworten Zitat
Basilikum

Registriert seit: 9. Aug 2003
389 Beiträge
 
Delphi 7 Professional
 
#3

Re: DNS und kein Ende TARecord

  Alt 2. Feb 2006, 20:17
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....
  Mit Zitat antworten Zitat
Benutzerbild von john2000
john2000

Registriert seit: 2. Feb 2006
3 Beiträge
 
#4

Re: DNS und kein Ende TARecord

  Alt 3. Feb 2006, 10:13
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
  Mit Zitat antworten Zitat
Basilikum

Registriert seit: 9. Aug 2003
389 Beiträge
 
Delphi 7 Professional
 
#5

Re: DNS und kein Ende TARecord

  Alt 3. Feb 2006, 10:59
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);
}
  Mit Zitat antworten Zitat
Benutzerbild von retnyg
retnyg

Registriert seit: 12. Feb 2005
193 Beiträge
 
#6

Re: DNS und kein Ende TARecord

  Alt 3. Feb 2006, 11:39
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;
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:58 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