Wie führt getaddrinfo() eine DNS-Suche durch?

Lesezeit: 4 Minuten

getaddrinfo() ist eine Funktion, die wir verwenden müssen Vor Erstellen eines socket() oder connect()ing, richtig? Wie kommuniziert dann getaddrinfo überhaupt mit dem DNS-Server?

PS: Wo kann ich die vollständige Quelle von getaddrinfo sehen?

  • Es tut mir leid, wenn das nicht viel Sinn macht … ich habe erst vor ein paar Tagen angefangen, Unix-Netzwerkprogrammierung zu lernen – ich bin ziemlich verwirrt.

    – n00b2000

    28. Januar 2010 um 20:07 Uhr

  • Sie müssen getaddrinfo() nicht aufrufen, bevor Sie einen Socket erstellen oder connect() aufrufen.

    anon

    28. Januar 2010 um 20:16 Uhr


  • connect() muss die IP-Adresse des Zielhosts mitgeteilt werden. Und um das zu haben, müssen wir mit getaddrinfo() eine Hostname-zu-IP-Suche durchführen.

    – BTR Naidu

    24. Februar 2015 um 8:12 Uhr

Benutzer-Avatar
mark4o

Es ist nicht notwendig anzurufen getaddrinfo() bevor Sie eine Steckdose erstellen oder eine Verbindung herstellen. Es wird verwendet, um einen Domainnamen zu übersetzen, z stackoverflow.coman eine IP-Adresse wie 69.59.196.211. Wenn Sie die IP-Adresse kennen, können Sie sich direkt mit dieser Adresse verbinden und müssen sie nicht verwenden getaddrinfo(). getaddrinfo() verwendet das DNS-Protokoll, um mit Ihren Nameservern zu kommunizieren, die mit ihrer IP-Adresse konfiguriert sind.

Der Glibc-Quellcode ist hier.

  • Sagen Sie mir eine Sache, wenn ich eine umgekehrte DNS-Suche durchführen möchte, welcher Systemaufruf ist dann erforderlich?

    – devsda

    1. März 2013 um 9:15 Uhr

  • Verwenden getnameinfo() für Adresse-zu-Name-Reverse-DNS-Lookups.

    – mark4o

    1. März 2013 um 19:04 Uhr

  • Weitere Informationen finden Sie hier, wie es im Detail funktioniert: jameshfisher.com/2018/02/03/what-does-getaddrinfo-do TL;DR läuft es durch /etc/nsswitch.conf und verwendet alle darin aufgeführten Module, um den Pfad aufzulösen. Normalerweise ist dies der Fall hosts: files myhostname dnswenn es schließlich auf das DNS-Modul trifft, lädt es diese Bibliothek dynamisch und führt dann die DNS-Suche durch, indem es sich /etc/hosts und /etc/resolv.conf ansieht.

    – Ryan

    19. Februar 2021 um 0:14 Uhr


Benutzer-Avatar
Tyler McHenry

Die kurze Antwort ist “es fragt das System“, die wiederum weiß, wie DNS-Lookups durchgeführt werden und welche Server zu verwenden sind.

getaddrinfo() ist dokumentiert durch die getaddrinfo(3) Handbuchseite, was bedeutet, dass es sich um eine C-Bibliotheksfunktion handelt. Es ist auch ein Posix funktionieren, also gibt es keine kanonische “Quelle”; Jede Standard-C-Bibliothek eines POSIX-konformen Betriebssystems implementiert ihre eigene Version. In jedem Fall ist die Quelle für genau diese Funktion wahrscheinlich nicht allzu aufschlussreich, da sie nur andere Funktionen und Betriebssystem-APIs aufrufen würde und Sie ziemlich weit nach unten gehen müssten, um zum eigentlichen DNS-Mechanismus zu gelangen. Sie sollten besser die Dokumentation des DNS-Protokolls selbst lesen, wenn Sie daran interessiert sind, wie das funktioniert.

  • Das ist völlig falsch. UNIX-Betriebssysteme haben keine eingebaute DNS-Suchfunktion. Dies geschieht im Userspace in der Standardbibliothek. code.metager.de/source/xref/eglibc/libc/sysdeps/posix/…

    – Hannes Landholm

    22. März 2013 um 11:15 Uhr


  • @HannesLandeholm Ich denke, die Nuance hier ist, dass UNIX Kernel hat keine eingebaute DNS-Lookup-Funktion, aber das “System” im allgemeineren Sinne des Wortes umfasst Userspace-Dienste, die mit dem System geliefert werden.

    – mtraceur

    19. Oktober 2017 um 20:16 Uhr


Hat Ihr Unix-System die Datei /etc/nsswitch.conf? Wenn dies der Fall ist, gibt der Eintrag “hosts” die Suchreihenfolge für die Auflösung von Hostnamen in IP-Adressen an. Hat Ihr System die Datei /etc/resolv.conf? Wenn dies der Fall ist, wird angegeben, welche DNS-Server verwendet werden sollen.

Wie Sie sehen können, kann getaddrinfo() ziemlich viel (und kann eine Weile dauern)!

Benutzer-Avatar
jstedfast

getaddrinfo() wahrscheinlich macht a connect() Hinter den Kulissen anrufen, aber es kennt bereits die IP-Adresse des DNS-Servers, mit dem es sich verbinden muss, um die Adresse des Hosts abzufragen, den Sie abfragen möchten.

getaddrinfo() wird nur benötigt wenn man abbilden möchte “www.somehost.com” an eine IP-Adresse, wird nicht als Starthilfe für den Anruf benötigt connect().

Sie können wahrscheinlich den vollständigen Quellcode für finden getaddrinfo() in glibc-Quellen, die Sie (unter anderem) hier finden können.

Hoffe, das klärt die Dinge für Sie.

Es verwendet das DNS-Protokoll (UDP)
http://www.freesoft.org/CIE/Topics/77.htm

  • FALSCH. Siehe Antwort von Steve Emmerson.

    – Bortzmeyer

    30. Januar 2010 um 17:26 Uhr

  • Es tut nicht? Kannst du das beweisen?

    – Zeppelin

    2. Februar 2010 um 6:21 Uhr

  • Sie können Ihre nsswitch.conf so ändern, dass sie sich nur auf /etc/hosts verlässt und KEINE DNS-Lookups durchführt.

    – Ioan Alexandru Cucu

    4. Mai 2014 um 10:24 Uhr

  • FALSCH. Siehe Antwort von Steve Emmerson.

    – Bortzmeyer

    30. Januar 2010 um 17:26 Uhr

  • Es tut nicht? Kannst du das beweisen?

    – Zeppelin

    2. Februar 2010 um 6:21 Uhr

  • Sie können Ihre nsswitch.conf so ändern, dass sie sich nur auf /etc/hosts verlässt und KEINE DNS-Lookups durchführt.

    – Ioan Alexandru Cucu

    4. Mai 2014 um 10:24 Uhr

1370670cookie-checkWie führt getaddrinfo() eine DNS-Suche durch?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy