GethostByName Función en lenguaje C

GethostByName Función en lenguaje C

El lenguaje C tiene una gran cantidad de funciones para programar los enchufes. Muchos de ellos se utilizan para obtener la información necesaria del host al que se debe hacer una conexión. La información que recupera este tipo de función es esencial para una conexión exitosa, ya que involucra las direcciones de dominio, números de puerto, etc.

En este artículo de Linux Sugerencia, aprenderá todo sobre la función GethostByName () que se usa más comúnmente para resolver y obtener las direcciones IP de los nombres de host.

Le mostraremos la sintaxis de esta función y la descripción teórica de cómo funciona, sus argumentos de entrada y salida, el tipo de datos que se usa en cada caso y su declaración correcta.

Luego aplicamos lo que aprendimos a través de los ejemplos prácticos, incluidos los fragmentos e imágenes del código, donde implementamos la función gethostByName () para resolver y obtener las direcciones del nombre de host.

Sintaxis de la función gethostByName () en lenguaje C

struct hostent *gethostByName (const char *nombre);

Descripción de la función GethostByName () en el lenguaje C

La función gethostByName () devuelve la dirección IP, el nombre oficial y la familia de la dirección de un nombre de host. Esta función le pide al servidor que resuelva y devuelva la dirección del nombre de host que se especifica como una cadena o puntero en el nombre de su argumento de entrada única.

Si no se produce ningún error, GethostByName () devuelve un puntero a una estructura de tipo "Hostent" que almacena la información del nombre de host. Si se produce un error, se devuelve un puntero nulo y el código de identificación de error se puede recuperar a través de la variable global H_errno.

Los nombres de host generalmente se asocian con una sola dirección, pero hay casos de grandes plataformas que tienen múltiples direcciones asociadas como "www.Google.com ". Por esta razón, las estructuras "hostentes" están diseñadas para contener una lista de direcciones. Se puede acceder a cada uno de ellos utilizando la matriz de punteros "h_addr_list". Más adelante, hay una sección especial que explica todo sobre este tipo de estructura.

Aunque la función gethostByName () se considera desaprobada y ha sido reemplazada por getAddrinfo (), su simplicidad en los argumentos de invocación y entrada del método lo hace muy útil cuando solo necesita la dirección de un nombre de host.

La función GethostByName (), así como todas las demás funciones de la familia Gethostxxxxxxx (), las estructuras y variables que usan, se declaran en el "NetDB.encabezado. Por lo tanto, debe incluirlos en su código como en el siguiente:

#incluir

Cómo obtener la dirección de un nombre de host con la función GethostByName () en el idioma C

En este ejemplo, utilizaremos la función gethostByName () para obtener la dirección y el nombre oficial del "www.núcleo.org " nombre de host.

Paso 1: El primer paso es insertar los encabezados requeridos y crear una función main () que devuelva un valor vacío.

Paso 2: Dentro de la función main (), declaramos el host del puntero a una estructura de tipo hostent que sirve como el argumento de salida de gethostByName (). También declaramos una matriz de 256 caracteres llamada "búfer" que almacena la cadena que contiene el nombre del host que pasamos como argumento de entrada.

Paso 3: Después de declarar las variables y la estructura que usamos, llamamos a la función GethostByName (), pasando el búfer como el argumento de entrada y la estructura del host como la salida argumenta.

Etapa 4: Si la función regresa correctamente, el siguiente paso es mostrar el nombre y la dirección oficiales. Para esto, usamos la función printf () en dos llamadas. La primera llamada muestra el nombre oficial del dominio, una cadena que es señalada por el elemento H_Name de la estructura del host. La segunda llamada muestra la dirección que se almacena en h_addr_list [0], definida como h_addr, que convertimos en una cadena usando la función inet_ntoa ().

El siguiente es el código completo con los cuatro pasos para este ejemplo:

//Paso 1
#incluir
#incluir
#incluir
#incluir
#incluir
#incluir
vacío principal()
//Paso 2

Structhostent *Host;
Char Buffer [255] = "www.núcleo.org ";
//Paso 3
host = gethostByName (buffer);
//Etapa 4
printf ("\ nip dirección de %s es:", host-> h_name);
printf ("%s \ n \ n", inet_ntoa (*(structin_addr*) host-> h_addr)));

La siguiente imagen muestra la compilación y ejecución de este código. Como podemos ver, GethostByName () obtiene una información del "www.núcleo.org " dominio y lo almacena en una estructura "hostente".

La estructura hostente

La estructura de "hostent" almacena los datos útiles que proporcionan el servidor cuando una consulta se realiza con funciones como gethostByName (). Esta conexión de socket se precisa para resolver las direcciones y devuelve la información, como el nombre de dominio, la familia de direcciones y una lista de direcciones si existe más de una. Puede ver esta estructura junto con una descripción detallada de cada elemento en el siguiente:

estructura hostente

char *h_name;
char ** h_aliases;
inth_addrtype;
inth_length;
char ** h_addr_list;
#defineh_addrh_addr_list [0]
;

H_NAME: Este es un puntero a una cadena con el nombre de dominio para el que se consulta.

H_Aliases: Es una lista de nombres alternativos.

H_addrtype: Este miembro especifica la familia de direcciones para la que se consulta.

h_length: Especifica el tamaño de la dirección.

h_addr_list: Este es el puntero a una lista de punteros de dirección. Si el servidor devuelve más de una dirección para el nombre consultado, se accede a cada uno a través de este puntero de la lista.

H_addr: Por simplicidad, esta estructura define el H_ADDR como un puntero a la primera dirección en el H_addr_List. El acceso es a través de esta definición.


Errores que pueden ocurrir al usar la función gethostByName (): cómo reconocerlos e identificarlos

La función gethostByName () devuelve un puntero nulo en caso de un error. La forma más fácil de detectar un error es usar una condición "si" donde la condición de entrada es el puntero de salida con un valor nulo. El siguiente es un fragmento de código que muestra esta técnica:

if ((host = gethostByName (buffer)) == null)
printf ("Se produjo un error al intentar obtener información del servidor.");

Cuando ocurre un error, su valor de identificación numérica se almacena automáticamente en la variable global H_errno. Las definiciones de los errores y su representación numérica se especifican en el "NetDB.H " encabezamiento.

El siguiente es un extracto del "NetDB.H "encabezado con los errores que puede generar la función gethostByName (), su valor numérico en H_errno y una breve descripción de cada error:

Definición Valor Error
HOST NO ENCONTRADO 1 Host no encontrado.
INTENTAR OTRA VEZ 2 No autorizado. Host no encontrado.
No_Recovery 3 Error no recuperable.
SIN DATOS 4 Nombre válido, sin registro de datos del tipo solicitado.

La forma más fácil de identificar un error es abrir un salto de interruptor condicional dentro de la condición "if" que vimos anteriormente. La condición de salto es la variable H_errno. Cada caso es la definición de cada uno de los errores que acabamos de describir.

Ahora, veamos el código del primer ejemplo en el que insertamos este método para detectar e identificar los errores en el paso 3.

//Paso 1
#incluir
#incluir
#incluir
#incluir
#incluir
#incluir
vacío principal()
vacío principal()
//Paso 2

Structhostent *Host;
Char Buffer [255] = "www.000000000.com ";
//Paso 3
if ((host = gethostByName (buffer)) == null)
Switch (H_errno)
case host_not_found:
printf ("host no encontrado. Error %i \ n ", h_errno);
romper;
CASE TRY_AGAIN:
printf ("No autoritativo. Host no encontrado. Error %i \ n ", h_errno);
romper;
Caso no_data:
printf ("Nombre válido, sin registro de datos del tipo solicitado. Error %i \ n ", h_errno);
romper;
Caso NO_COVERY:
printf ("Error no recuperable. Error %i \ n ", h_errno);
romper;


Demás
//Etapa 4
printf ("\ nip dirección de %s es:", host-> h_name);
printf ("%s \ n \ n", inet_ntoa (*(structin_addr*) host-> h_addr)));

Como puede ver, especificamos un dominio inexistente en el búfer que sirve como argumento de entrada a la función gethostByName () en este caso. Esto da como resultado un error identificado en el interruptor de salto condicional.

La siguiente imagen muestra la compilación y ejecución de este código. En este caso, la función gethostByName () no pudo encontrar el host. Entonces, el programa salta al

Host _not_ Caso encontrado de la condición del interruptor:

Conclusión

En este artículo de Sugerencia de Linux, le mostramos cómo usar la función GethostByName () para obtener una información sobre un nombre de host. Aprendimos la descripción teórica de cómo funciona y cómo se componen los argumentos de entrada y salida, incluida una sección especial que describe cómo se compone una estructura de "hostent".

Luego implementamos el uso de esta función en ejemplos prácticos. Al hacerlo, utilizamos los fragmentos de código para mostrar los encabezados necesarios para su uso, la declaración de estructuras y variables para sus argumentos, y la conversión y visualización de la información obtenida.

Además, incluimos una sección que explica los posibles errores que esta función puede generar y enseñar las técnicas para detectarlos e identificarlos.

Como hemos visto en este artículo, la simplicidad de esta función y su rápida implementación significa que todavía es útil, a pesar de que se consideró obsoleta.