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?
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?
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 dns
wenn 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
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)!
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
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