Função gethostbyname na linguagem C

Função gethostbyname na linguagem C

A linguagem C tem um grande número de funções para programar os soquetes. Muitos deles são usados ​​para obter as informações necessárias do host para o qual uma conexão deve ser feita. A informação que esse tipo de função recupera é essencial para uma conexão bem -sucedida, pois envolve os endereços de domínio, números de porta e assim por diante.

Neste artigo do Linux, você aprenderá tudo sobre a função GethostbyName () que é mais comumente usada para resolver e obter os endereços IP dos nomes do host.

Mostraremos a sintaxe dessa função e a descrição teórica de como ela funciona, seus argumentos de entrada e saída, o tipo de dados usado em cada caso e sua declaração correta.

Em seguida, aplicamos o que aprendemos através dos exemplos práticos, incluindo os trechos e imagens de código, onde implementamos a função GethostByName () para resolver e obter os endereços do nome do host.

Sintaxe da função GetHostbyName () na linguagem C

hostent struct *gethostbyname (const char *nome);

Descrição da função GethostbyName () na linguagem C

A função GethostbyName () retorna o endereço IP, o nome oficial e a família de endereços de um nome de host. Esta função pede ao servidor para resolver e retornar o endereço do nome do host, que é especificado como uma string ou ponteiro para ele em seu único nome de argumento de entrada.

Se houver erro, GethostbyName () retorna um ponteiro para uma estrutura do tipo "hostent" que armazena as informações do nome do host. Se ocorrer um erro, um ponteiro nulo será retornado e o código de identificação de erros pode ser recuperado através da variável Global H_ERRNO.

Os nomes de host geralmente estão associados a um único endereço, mas há casos de grandes plataformas que possuem vários endereços associados, como “www.Google.com ”. Por esse motivo, as estruturas "hostentes" são projetadas para conter uma lista de endereços. Cada um deles pode ser acessado usando a matriz "h_addr_list" de ponteiros. Mais adiante, há uma seção especial que explica tudo sobre esse tipo de estrutura.

Embora a função gethostbyname () seja considerada depreciada e foi substituída pelo getaddrinfo (), sua simplicidade na invocação de métodos e argumentos de entrada o torna muito útil quando você só precisa do endereço de um nome do host.

A função GethostByName (), bem como todas as outras funções da família Gethostxxxx (), as estruturas e variáveis ​​que eles usam, são declaradas no “NetDB.H ”cabeçalho. Portanto, você deve incluí -los no seu código, como no seguinte:

#incluir

Como obter o endereço de um nome de host com a função GethostByName () na linguagem C

Neste exemplo, usaremos a função gethostbyname () para obter o endereço e o nome oficial do “Www.núcleo.org ” nome de anfitrião.

Passo 1: O primeiro passo é inserir os cabeçalhos necessários e criar uma função main () que retorne um valor vazio.

Passo 2: Dentro da função Main (), declaramos o host de ponteiro a uma estrutura do tipo hostent que serve como o argumento de saída do gethostbyname (). Também declaramos uma matriz de 256 caracteres chamada "buffer", que armazena a string que contém o nome do host que passamos como o argumento de entrada.

etapa 3: Depois de declarar as variáveis ​​e a estrutura que usamos, chamamos a função gethostbyname (), passando o buffer como o argumento de entrada e a estrutura do host como argumentos de saída.

Passo 4: Se a função retornar com sucesso, o próximo passo é exibir o nome e o endereço oficial. Para isso, usamos a função printf () em duas chamadas. A primeira chamada mostra o nome oficial do domínio, uma string que é apontada pelo elemento h_name da estrutura do host. A segunda chamada mostra o endereço armazenado em h_addr_list [0], definido como h_addr, que convertemos em uma string usando a função inet_ntoa ().

A seguir, o código completo com todas as quatro etapas para este exemplo:

//Passo 1
#incluir
#incluir
#incluir
#incluir
#incluir
#incluir
void main ()
//Passo 2

Structhostent *host;
Buffer de char [255] = "www.núcleo.org ";
//Etapa 3
host = gethostbyname (buffer);
//Passo 4
printf ("\ nip endereço de %s é:", host-> h_name);
printf ("%s \ n \ n", inet_ntoa (*(structin_addr*) host-> h_addr));

A imagem a seguir mostra a compilação e execução deste código. Como podemos ver, GethostbyName () obtém uma informação do “Www.núcleo.org ” domínio e o armazena em uma estrutura "hostente".

A estrutura hospedeira

A estrutura "hostent" armazena os dados úteis fornecidos pelo servidor quando uma consulta é feita com funções como GethostbyName (). Essas conexões de soquete são pré -prequenciadas para resolver os endereços e retornar as informações como o nome de domínio, a família de endereços e uma lista de endereços se mais de um existir. Você pode ver essa estrutura junto com uma descrição detalhada de cada elemento no seguinte:

estrutura hostent

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

h_name: Este é um ponteiro para uma corda com o nome de domínio para o qual é consultado.

h_aliases: É uma lista de nomes alternativos.

h_addrtype: Este membro especifica a família de endereços para a qual é consultado.

h_length: Especifica o tamanho do endereço.

h_addr_list: Este é o ponteiro de uma lista de ponteiros de endereço. Se o servidor retornar mais de um endereço para o nome consultado, cada um será acessado através deste ponteiro da lista.

h_addr: Por simplicidade, essa estrutura define o H_ADDR como um ponteiro para o primeiro endereço no H_ADDR_LIST. O acesso é através desta definição.


Erros que podem ocorrer ao usar a função GethostByName (): como reconhecê -los e identificá -los

A função GethostbyName () retorna um ponteiro nulo em caso de erro. A maneira mais fácil de detectar um erro é usar uma condição "se" em que a condição de entrada seja o ponteiro de saída com um valor nulo. A seguir, é apresentado um trecho de código que mostra esta técnica:

if ((host = gethostbyname (buffer)) == null)
printf ("Ocorreu um erro ao tentar obter informações do servidor.");

Quando ocorre um erro, seu valor de identificação numérica é automaticamente armazenado na variável Global H_ERRNO. As definições dos erros e sua representação numérica são especificadas no “NETDB.h " cabeçalho.

A seguir, é apresentado um trecho do “netdb.H ”Cabeçalho com os erros que a função GethostByName () pode gerar, seu valor numérico em H_ERRNO e uma breve descrição de cada erro:

Definição Valor Erro
Host_not_found 1 Host não encontrado.
TENTE NOVAMENTE 2 Não autoritativo. Host não encontrado.
No_recovery 3 Erro não recuperável.
NO_DATA 4 Nome válido, nenhum registro de dados do tipo solicitado.

A maneira mais fácil de identificar um erro é abrir um salto condicional na condição "se" que vimos anteriormente. A condição de salto é a variável h_errno. Cada caso é a definição de cada um dos erros que acabamos de descrever.

Agora, vejamos o código do primeiro exemplo em que inserimos esse método para detectar e identificar os erros na Etapa 3.

//Passo 1
#incluir
#incluir
#incluir
#incluir
#incluir
#incluir
void main ()
void main ()
//Passo 2

Structhostent *host;
Buffer de char [255] = "www.000000000.com ";
//Etapa 3
if ((host = gethostbyname (buffer)) == null)
switch (h_errno)
case host_not_found:
printf ("host não encontrado. Erro %i \ n ", h_errno);
quebrar;
case Try_Again:
printf ("Não autoritativo. Host não encontrado. Erro %i \ n ", h_errno);
quebrar;
caso no_data:
printf ("Nome válido, nenhum registro de dados do tipo solicitado. Erro %i \ n ", h_errno);
quebrar;
Caso No_recovery:
printf ("erro não recuperável. Erro %i \ n ", h_errno);
quebrar;


Outro
//Passo 4
printf ("\ nip endereço de %s é:", host-> h_name);
printf ("%s \ n \ n", inet_ntoa (*(structin_addr*) host-> h_addr));

Como você pode ver, especificamos um domínio inexistente no buffer que serve como argumento de entrada para a função GethostByName () neste caso. Isso resulta em um erro que é identificado no interruptor de salto condicional.

A imagem a seguir mostra a compilação e execução deste código. Nesse caso, a função gethostbyname () não conseguiu encontrar o host. Então, o programa salta para o

Host _not_ encontrado caso da condição de interruptor:

Conclusão

Neste artigo da dica do Linux, mostramos como usar a função gethostbyname () para obter uma informação sobre um nome de host. Aprendemos a descrição teórica de como ela funciona e como os argumentos de entrada e saída são compostos, incluindo uma seção especial que descreve como uma estrutura "hostente" é composta.

Em seguida, implementamos o uso dessa função em exemplos práticos. Ao fazer isso, usamos os trechos de código para mostrar os cabeçalhos necessários para seu uso, a declaração de estruturas e variáveis ​​para seus argumentos, e a conversão e exibição das informações obtidas.

Além disso, incluímos uma seção que explica os possíveis erros que essa função pode gerar e ensinar as técnicas para detectar e identificá -los.

Como vimos neste artigo, a simplicidade dessa função e sua implementação rápida significam que ela ainda é útil, embora tenha sido considerada obsoleta.