Trucos de Programacion "C" y "C++" en castellano
Entornos Linux y Windows

Servicio de resolución de Nombres

Resolución de nombres de dominio (DNS)

Uno de los pilares de internet, es, sin lugar a dudas, el servicio de resolución de nombres. Este servicio consiste en darle al ordenador un nombre de dominio (EJ: www.google.com), y este te devuelve una dirección ip (Ej: 192.168.1.1).

Para poder utilizar este servicio en C, necesitamos utilizar la función gethostbyname (Que microsoft pretende sustituir por getaddrinfo, pero para hacer una aplicación "compatible", usaremos a lo largo de todo el artículo la función gethostbyname), y la estructura hostent .

Tanto la función como la estructura estan definidas en la cabecera <netdb.h>. Su estructura es la siguiente:

La gethostbyname() devuelve un puntero a la estructura struct hostent que se ha llenado, o NULL en caso de error (Sin embargo no se establece errno, sino h_errno). Describo a continuación los campos de la estructura hostent:

  • h_name -- Nombre oficial de la máquina.
  • h_aliases -- Un vector terminado en NULL de nombres alternativos de máquina.
  • h_addrtype -- Tipo de la dirección que se devuelve; usualmente AF_INET.
  • h_length -- La longitud de la dirección en bytes.
  • h_addr_list -- Un vector terminado en cero de direcciones de red de la máquina. Las direcciones siguen la Ordenación de bytes de la red.
  • h_addr -- La primera dirección de h_addr_list.

NOTA: Para ejecutar cualquier operación empleando sockets en una plataforma Microsoft Windows, se requiere el empleo de la cabecera <winsock.h>, inicializar una variable de estructura tipo WSADATA, e incluir en las dependencias del proyecto la librería wsock32.lib. No será necesario incluir ninguna de las cabeceras que se especifica en este artículo.

Pongo un ejemplo multiplataforma de como se emplearía esta función:

NOTA: Para compilar esta aplicación en linux, si el gcc no tiene predefinido la directiva linux, habría que añadir a continuación de la línea el parámetro -DLINUX. Si se emplea cerr (Un stream de c++), ep fichero debería tener una extensión cpp, y añadir a la línea de compilación el parámetro lstdc++

NOTA: La función previamente expuesta, solo resolvería direcciones de tipo A, si queremos hacer una aplicación que acceda ademas a registros MX, o de algun otro tipo, deberíamos emplear la función res_search.

 

Webmaster

Hiperion Pozuelo, Madrid, ES
Soy una persona sencilla, quizas demasiado seria, que disfruto de la vida.
Actualmente busco pareja.