2010-01-28 27 views
16

getaddrinfo() es una función que necesitamos usar antes de creando un socket() o connect() ing, ¿no? Entonces, ¿cómo se comunica getaddrinfo con el servidor DNS en primer lugar?¿Cómo hace getaddrinfo() la búsqueda de DNS?

PD: ¿Dónde puedo ver la fuente completa de getaddrinfo?

+0

Lo siento si esto no tiene mucho sentido ... empecé a aprender la programación de la red Unix solo hace un par de días. Estoy bastante confundido. – n00b2000

+0

No necesita llamar a getaddrinfo() antes de crear un socket o antes de llamar a connect(). –

+0

connect() necesita conocer la dirección IP del host de destino. Y para tener eso, necesitamos realizar un nombre de host para la búsqueda de IP usando getaddrinfo() –

Respuesta

4

La respuesta corta es "que pide el sistema", que a su vez sabe cómo hacer búsquedas de DNS y qué servidores de usar.

getaddrinfo() está documentado en la página de manual getaddrinfo(3), lo que significa que es una función de biblioteca C. También es una función POSIX, por lo que no hay una "fuente" canónica; cada biblioteca C estándar de un sistema operativo que se ajuste a POSIX implementará su propia versión. De cualquier forma, el origen de esa función probablemente no sea demasiado esclarecedor, ya que solo llamaría a otras funciones y API del sistema operativo, y tendría que profundizar bastante para llegar al mecanismo DNS real. Será mejor que leas la documentación del protocolo DNS si estás interesado en cómo funciona.

+2

Esto es completamente incorrecto. Los sistemas operativos UNIX no tienen incorporada una función de búsqueda de DNS. Esto se hace en el espacio de usuario en la biblioteca estándar. http://code.metager.de/source/xref/eglibc/libc/sysdeps/posix/getaddrinfo.c –

+0

@HannesLandeholm Creo que el matiz aquí es que el kernel * de UNIX * no tiene una función de búsqueda de DNS incorporada , pero el "sistema", en el sentido más general de la palabra, incluye servicios de espacio de usuario que se envían con el sistema. – mtraceur

1

getaddrinfo() es probable que haga una llamada connect() entre bastidores, sin embargo, ya conoce la dirección IP del servidor DNS al que necesita conectarse para consultar la dirección del host que le solicita que consulte.

getaddrinfo() sólo es necesario si desea asignar "www.somehost.com" a una dirección IP, no se necesita como imprimación para llamar connect().

Probablemente pueda encontrar el código fuente completo para getaddrinfo() en fuentes glibc que podría encontrar aquí (entre otros lugares).

Espero que aclare las cosas para usted.

+2

Si desea ver cómo glibc nombra las búsquedas, comience aquí: http://cvs.savannah.gnu.org/viewvc/libc/resolv/nss_dns/dns-host.c?revision=1.57&root=libc&view=markup (cuidado: es ** complicado **). – caf

10

No es necesario llamar al getaddrinfo() antes de crear un zócalo o una conexión. Se utiliza para traducir un nombre de dominio, como stackoverflow.com, a una dirección IP como 69.59.196.211. Si conoce la dirección IP, puede conectarse directamente a esa dirección y no es necesario utilizar getaddrinfo(). getaddrinfo() usa el protocolo DNS para hablar con sus servidores de nombres, que se configuran usando su dirección IP.

El código fuente de glibc es here.

+0

Dime una cosa, si quiero hacer una búsqueda DNS inversa, ¿qué llamada al sistema requiere? – devsda

+2

Use 'getnameinfo()' para las búsquedas DNS inversas de dirección a nombre. – mark4o

7

¿Su sistema Unix tiene el archivo /etc/nsswitch.conf? Si es así, la entrada "hosts" da la orden de búsqueda para resolver nombres de host en direcciones IP. ¿Su sistema tiene el archivo /etc/resolv.conf? Si es así, entonces especifica qué servidores DNS usar.

Como puede ver, getaddrinfo() puede hacer bastante (¡y puede tardar un tiempo)!

Cuestiones relacionadas