zoukankan      html  css  js  c++  java
  • 学习笔记之gethostbyname函数

      我们现在认知一台计算机主机通常采用直观可读的名字。例如博客园我们会记住 www.cnblogs.com 而不是记住42.121.252.58这个IP。对于大多数的应用程序来说应该是处理名字而不是处理地址。如果说对于一个点分十进制来说还好记住,那么当使用IPv6时,IP地址就不是那么好记了。

      下面将介绍Linux下的一个函数 gethostbyname ,查找主机名最基本的函数。如果调用成功,它就返回一个指向hostent结构的指针,该结构中含有所查找主机的所有IPv4地址。这个函数的局限是只能返回IPv4地址,getaddrinfo函数是同时能处理IPv4和IPv6地址,不过这个不在讨论的范围。

      函数的定义:

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

     

      hostent 结构如下:

    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是正式的主机名,h_aliases是主机的别名。h_addrtype一般是AF_INET表示使用IP。h_length表示地址长度,而IPv4是4个字节。最后的h_addr_list表示地址对应的所有IP地址。(Ps:一个地址有多个IP对应,一般是用于负载吧,比如一个大型网站可能南方,北方,国外等不同的地方都有主机,不同的IPS也会有不同的IP,总之是很多情况。需要多个IP)。

      一个调用gethostbyname并显示返回的信息的简单例子。

     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
    ",ptr,hstrerror(h_errno));//出错信息,并记录在h_error中
    18           continue;
    19       }
    20       printf("official hostname: %s
    ",hptr->h_name);//正式主机名
    21 
    22       for(pptr=hptr->h_aliases;*pptr!=NULL;pptr++)//遍历所有的主机别名
    23           printf("	alias: %s
    ",*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("	address: %s
    ",
    31                     inet_ntop(hptr->h_addrtype,*pptr,str,sizeof(str)));//inet_ntop转换为点分十进制
    32             break;
    33           default:
    34             printf("unknown address type
    ");
    35             break;
    36       }
    37     }
    38     return 0;
    39 }

      编译 gcc hostent.c -o hostent

      

      那个Server: 202.96.134.133是本地的dns ,在/etc/resolv.conf 中。

      程序在CentOS6.4中运行成功。参考UNP这本书。

      

      本文地址:http://www.cnblogs.com/wunaozai/p/3753415.html 

  • 相关阅读:
    spring cloud中代理服务器zuul的使用
    springcloud断路器Dashboard监控仪表盘的使用
    Java中 final和static解析
    使用redis和thread告警并避免重复告警
    Windows 下redis的安装和使用
    服务端监控工具Nmon使用方法
    linux性能监控工具nmon生成HTML报告-EasyNmon
    接口测试用例设计
    RESTful API浅谈
    接口测试与总结
  • 原文地址:https://www.cnblogs.com/wunaozai/p/3753415.html
Copyright © 2011-2022 走看看