![]() |
IP nach Hostname
Hi,
ich suche nun schon den ganzen Tag. Leider finde ich nix was Funktioniert. Ich möchte mit dem DNSResolver von Indy mit einer IP den Hostnamen erfragen. Leider weiß ich nicht was ich im QueryType einstellen muss. So sieht meine abfrage aus. Stelle ich qtPTR ein, läuft es zwar aber ich bekomme nur die IP zurück. Nehme ich qtA dann meint er "Der DNS-Server meldet einen Fehler im Abfragenamen." Was muss ich machen/einstellen damit ich den Hostnamen zurückbekomme? Vielen dank im Voraus
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var i :Integer; begin IdDNSResolver1.Resolve('192.168.0.2'); for i := 0 to IdDNSResolver1.QueryResult.Count-1 do begin Memo1.Lines.Add(IdDNSResolver1.QueryResult[i].Name); end; end; |
AW: IP nach Hostname
Ist der DNS Server denn zugewiesen?
Die fritz.box kann ich mit diesem Code finden:
Delphi-Quellcode:
Ergebnis:
var
R: TIdDNSResolver; I: Integer; begin R := TIdDNSResolver.Create; try R.QueryType := [qtPTR]; R.Host := '192.168.178.1'; try R.Resolve('192.168.178.20'); // for I := 0 to R.QueryResult.Count - 1 do // WriteLn(BytesToString(R.QueryResult[I].RData)); WriteLn(R.QueryResult[I].Name); except on E: Exception do WriteLn(E.Message); end; finally R.Free; end; end;
Code:
20.178.168.192.in-addr.arpa
20.178.168.192.in-addr.arpa fritz.box |
AW: IP nach Hostname
Hi,
diese ausgabe bekomme ich auch. Aber in der letzen Zeile steht der DNS Server mit Namen. Nicht der gesuchte Host. Das ist meine ausgabe. Ich habe hier einen eigenen DNS laufen (Debian/bind9). Zu deiner Frage: Ja, DNS ist eingetragen und bei QueryType qtPTR auf True.
Code:
2.0.168.192.in-addr.arpa
0.168.192.in-addr.arpa dns-server.lan.int |
AW: IP nach Hostname
Schau bitte mal, ob Du aus diesem Quelltextfragment schlau wirst (hab' ich in 'nem alten Delphi-7-Programm gefunden):
Delphi-Quellcode:
// DNS = TIdDNSResolver
s := 'www.delphipraxis.net'; // oder eine IP DNS.Host := Reg.NameServer; // Dein DNS-Server DNS.ClearInternalQuery; DNS.QueryType := [qtA]; // Liefert einen A- und einen Name-Record - hier auch mal die anderen möglichen Varianten probieren z. B. qtName Reg.WriteAppInfoLog(Format('DNS-Abfrage: Host = %s',[s])); Try DNS.Resolve(s); Reg.WriteAppInfoLog('DomainName: %s',[DNS.QueryResult.DomainName]); if DNS.QueryResult.Count > 0 then begin for i := 0 to DNS.QueryResult.Count - 1 do begin case DNS.QueryResult.Items[I].RecType of qtA: begin if Trim(TARecord(DNS.QueryResult.Items[I]).IPAddress) = '' then begin Reg.WriteAppInfoLog('IP: %s', [GetIPFromRData(DNS.QueryResult.Items[I].RData)]); end else begin Reg.WriteAppInfoLog('IP: %s',[TARecord(DNS.QueryResult.Items[I]).IPAddress]); end; end; qtNS: Reg.WriteAppLog(' ' + TNSRecord(DNS.QueryResult.Items[I]).HostName); qtMD: Reg.WriteAppLog(' ' + TResultRecord(DNS.QueryResult.Items[I]).Name); qtMF: Reg.WriteAppLog(' ' + TResultRecord(DNS.QueryResult.Items[I]).Name); qtName: Reg.WriteAppLog(' ' + TNAMERecord(DNS.QueryResult.Items[I]).HostName); qtSOA: begin Reg.WriteAppLog(' Primary: ' + TSOARecord(DNS.QueryResult.Items[I]).Primary); Reg.WriteAppLog(' ResponsiblePerson: ' + TSOARecord(DNS.QueryResult.Items[I]).ResponsiblePerson); Reg.WriteAppLog(' Serial: ' + IntToStr(TSOARecord(DNS.QueryResult.Items[I]).Serial)); Reg.WriteAppLog(' Refresh: ' + IntToStr(TSOARecord(DNS.QueryResult.Items[I]).Refresh)); Reg.WriteAppLog(' Retry: ' + IntToStr(TSOARecord(DNS.QueryResult.Items[I]).Retry)); Reg.WriteAppLog(' Expire: ' + IntToStr(TSOARecord(DNS.QueryResult.Items[I]).Expire)); Reg.WriteAppLog(' MinimumTTL: ' + IntToStr(TSOARecord(DNS.QueryResult.Items[I]).MinimumTTL)); end; qtMB: Reg.WriteAppLog(' ' + TResultRecord(DNS.QueryResult.Items[I]).Name); qtMG: Reg.WriteAppLog(' ' + TResultRecord(DNS.QueryResult.Items[I]).Name); qtMR: Reg.WriteAppLog(' ' + TResultRecord(DNS.QueryResult.Items[I]).Name); qtWKS: begin Reg.WriteAppLog(' ' + TWKSRecord(DNS.QueryResult.Items[I]).IPAddress); Reg.WriteAppLog(' ' + IntToStr(TWKSRecord(DNS.QueryResult.Items[I]).Protocol)); end; qtPTR: Reg.WriteAppLog(' ' + TPTRRecord(DNS.QueryResult.Items[I]).HostName); qtHINFO: begin Reg.WriteAppLog(' ' + THINFORecord(DNS.QueryResult.Items[I]).CPU); Reg.WriteAppLog(' ' + THINFORecord(DNS.QueryResult.Items[I]).OS); end; qtMINFO: begin Reg.WriteAppLog(' ' + TMINFORecord(DNS.QueryResult.Items[I]).ResponsiblePersonMailbox); Reg.WriteAppLog(' ' + TMINFORecord(DNS.QueryResult.Items[I]).ErrorMailbox); end; qtMX: Reg.WriteAppLog(' ' + TMXRecord(DNS.QueryResult.Items[I]).ExchangeServer+',' + IntToStr(TMXRecord(DNS.QueryResult.Items[I]).Preference)); qtTXT: Reg.WriteAppLog(TTextRecord(DNS.QueryResult.Items[I]).Text.Text); else Reg.WriteAppLog('?:'); Reg.WriteAppLog(' ' + TResultRecord(DNS.QueryResult.Items[I]).Name); Reg.WriteAppLog(' ' + TResultRecord(DNS.QueryResult.Items[I]).RData); end; end; end else begin Reg.WriteAppErrorLog('Kein Ergebnis erhalten.'); end; DNS.Disconnect; except on e : Exception do begin Reg.WriteAppInfoLog('DNS-Abfrage: ' + e.Message); try DNS.Disconnect; except end; end; end; ... function GetIPFromRData(RData : TIDBytes) : String; var s : String; i : Integer; begin s := BytesToString(RData); if Length(s) = 4 then begin Result := ''; for i := 1 to Length(s) do Result := Result + IntToStr(Ord(s[i])) + '.'; Result := Copy(Result,1,Length(Result) - 1); end else begin Result := s; end; end; |
AW: IP nach Hostname
Zitat:
|
AW: IP nach Hostname
Hi,
ja. Auch nslookup liefert das richtige zurück. nslookup 192.168.0.2 Server: dns-server.lan.int Address: 192.168.0.254 Name: mainpc.lan.int Address: 192.168.0.2 |
AW: IP nach Hostname
Zitat:
Wird nur für diese Adresse ein Fehler zurückgemeldet oder funktioniert es generell mit keiner Adresse? |
AW: IP nach Hostname
Ups, ich wollte die IndyVersion bei schreiben. Habe es aber wohl vergessen. Es ist Version 10.6.2.0.
Nein, es geht mit keiner IP. |
AW: IP nach Hostname
Hallo DelTurbo,
du hast irgendwo vor dem Resolve(..) den von dir gewünschten DNS Server angegeben? In deinem Fall:
Delphi-Quellcode:
IdDNSResolver1.Host := '192.168.0.254'; // Dein DNS Server
Und wenn das auch nicht klappen sollte, hast du "ICS Overbyte" (via GetIt installierbar)? Dort gibt's auch viele Beispiele zu solchen Problemstellungen. Gruss Michael |
AW: IP nach Hostname
Hi,
ich habe das auf der Form liegen. Dort ist alles eingetragen. Deswegen erstelle ich das auch nicht mit Create. Aber im Host ist natürlich der DNS eingetragen. Ich glaube sonst kommt nichts zurück bzw. ein fehler. Warum ich Indy nehmen "muss". Ich möchte das, wenn es denn mal läuft, auf einem Raspi (ARM CPU) einsetzen. Dort gibt es leider kein Overbyte. Eigentlich mache ich das immer so. Ich teste das was ich vorhabe in Delphi und wenn es klappt kann ich das in ![]() Ich werde heute mal den Code von @Delphi.Narium probieren und berichten ob es klappt. |
AW: IP nach Hostname
Huhu,
leider klappt das Beispiel ebenfalls nicht. Weder mit Indy 9 noch mit Indy 10. Meldung: Der DNS-Server meldet einen Fehler im Abfragenamen. :( |
AW: IP nach Hostname
Such' Dir bitte einen freien DNS-Server, der Abfragen von jedem annimmt.
Dann prüfst Du Deine Routine gegen Delphipraxis, Google, was auch immer in der weiten Welt des Internets. Wenn das alles nix wird, dann (und nur dann) liegt der Fehler in Deiner Implementierung. Andernfalls mag einfach Dein DNS-Server nicht. Hast Du da ein Testprojekt, das Du hier anhängen kannst? Dann tu das bitte. Wir können dann versuchen, ob's bei uns auch nicht klappt oder ob's klappt. Es muss wohl erstmal geklärt werden: Liegt das Problem in Deiner Implementierung oder den Innereien der Indys oder ist da irgendwas bei Deinem DNS-Server oder in Deinem lokalen Netz, was querschießt. ![]() Achso: Das von mir gefunden Fragment funktioniert in 'nem Programm seit Jahren anstandslos, Indy-Version 10.6.2.0. Daher die Vermutung: Der Fehler liegt ausserhalb der Implementierung. |
AW: IP nach Hostname
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,
hier kannst du sehen das es nichts anderes macht als dein beispiel. Ich habe es nun so gehalten das du den DNS selber eintragen kannt. qtA ist wie bei dir vorgegeben. Der DNS ist der von Google. Kannst du narütlich ändern. Den QueryType kannst du im Object ändern. Gruß PS.: Mit der DNS Abfrage von Clever Internet Suite klappt es einwandfrei. Leider kann ich das nicht brauchen. (siehe oben, ich muss leider Indy nehmen) |
AW: IP nach Hostname
Liste der Anhänge anzeigen (Anzahl: 1)
Oh, jetzt verstehe ich, wo das Poblem liegt:
Hostname nach IP geht - aber - nicht umgekehrt. Hätte ich ja auch mal 'ne Woche früher drauf kommen können :evil::roll::oops::cry: Ok: Du suchst sowas: ![]() Und noch 'ne Viertelstunde später fällt bei mir dann auch der Groschen: Statt qtA bitte mal qtPTR versuchen. Kommandozeile: ping /a ![]() ping /a 138.201.18.17 liefert mir danielwolf.eu Dein Programm tut das mit QueryType := qtPTR ebenfalls. Was Du möchtest geht also mit Indy, man muss nur wissen wie und da gehöre ich dann wohl eher nicht zu :-( (oder erst nach 'ner Woche ;-)) ![]() |
AW: IP nach Hostname
Zitat:
Vielen dank für deine Hilfe. Bei mir klappt es nun endlich. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:53 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz