La función gethostbyname de las notas de estudio

La dirección de este artículo: http://www.cnblogs.com/wunaozai/p/3753415.html 

Ahora reconocemos que el host de una computadora generalmente adopta un nombre legible intuitivamente. Por ejemplo, recordaremos www.cnblogs.com en lugar de 42.121.252.58 en el jardín del blog. Para la mayoría de las aplicaciones, debe tratar con nombres en lugar de direcciones. Si es fácil de recordar para un decimal con puntos, entonces cuando se usa IPv6, la dirección IP no es tan fácil de recordar.

  A continuación se presentará una función gethostbyname en Linux, la función más básica para encontrar el nombre de host. Si la llamada tiene éxito, devuelve un puntero a la estructura del host, que contiene todas las direcciones IPv4 del host que se busca. La limitación de esta función es que solo puede devolver direcciones IPv4. La función getaddrinfo puede manejar direcciones IPv4 e IPv6, pero esto está más allá del alcance de la discusión.

  La definición de la función:

1 #include <netdb.h>
2 struct hostent * gethostbyname(const char * hostname);   //返回:若成功则为非空指针,若出错则为NULL且设置h_errno

 

  La estructura del albergue es la siguiente:

1 struct hostent{
2     char *h_name; /*official (canonical ) name of host*/
3     char **h_aliases; /*pointer to array of pointers to alias names*/
4     int h_addrtype; /*host address type:AF_INET*/
5     int h_length; /*length of address: 4*/
6     char **h_addr_list; /*ptr to array of ptrs with IPv4 addrs*/
7 };

  h_name es el nombre de host oficial y h_aliases es el alias del host. h_addrtype es generalmente AF_INET para indicar el uso de IP. h_length representa la longitud de la dirección, mientras que IPv4 es de 4 bytes. El último h_addr_list representa todas las direcciones IP correspondientes a las direcciones. (Ps: hay varias IP correspondientes a una dirección, generalmente utilizadas para la carga. Por ejemplo, un sitio web grande puede tener hosts en diferentes lugares, como el sur, el norte y países extranjeros. Diferentes IPS también tendrán diferentes IP. En resumen , hay muchas situaciones. Necesita múltiples IP).

  Un ejemplo simple de llamar a gethostbyname y mostrar la información devuelta.

 1 #include <stdio.h>
 2 #include <arpa/inet.h>
 3 #include <netdb.h>
 4 
 5 
 6 int main(int argc,char **argv)
 7 {
 8     char *ptr,**pptr;
 9     char str[INET_ADDRSTRLEN];
10     struct hostent *hptr;
11 
12     while(--argc>0)//判断参数的个数是否合法
13     {
14       ptr=*++argv;//取第一个参数及以后
15       if((hptr=gethostbyname(ptr))==NULL)//开始获取
16       {
17           printf("gethostbyname error for host: %s: %s\n",ptr,hstrerror(h_errno));//出错信息,并记录在h_error中
18           continue;
19       }
20       printf("official hostname: %s\n",hptr->h_name);//正式主机名
21 
22       for(pptr=hptr->h_aliases;*pptr!=NULL;pptr++)//遍历所有的主机别名
23           printf("\talias: %s\n",*pptr);
24 
25       switch(hptr->h_addrtype)//判断socket类型
26       {
27           case AF_INET:  //IP类为AF_INET
28             pptr=hptr->h_addr_list; //IP地址数组
29             for(;*pptr!=NULL;pptr++)
30                 printf("\taddress: %s\n",inet_ntop(hptr->h_addrtype,*pptr,str,sizeof(str)));//inet_ntop转换为点分十进制
32             break;
33           default:
34             printf("unknown address type\n");
35             break;
36       }
37     }
38     return 0;
39 }

  Compilar gcc hostent.c -o hostent

  

  El servidor: 202.96.134.133 es el dns local, en /etc/resolv.conf

Supongo que te gusta

Origin blog.csdn.net/xiaolei251990/article/details/84826829
Recomendado
Clasificación