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 

  • 相关阅读:
    Java 蓝桥杯 算法训练 貌似化学
    Java 蓝桥杯 算法训练 貌似化学
    Java 蓝桥杯 算法训练 字符串的展开 (JAVA语言实现)
    Java 蓝桥杯 算法训练 字符串的展开 (JAVA语言实现)
    Java 蓝桥杯 算法训练 字符串的展开 (JAVA语言实现)
    Java 蓝桥杯 算法训练 字符串的展开 (JAVA语言实现)
    Java 蓝桥杯 算法训练 字符串的展开 (JAVA语言实现)
    JAVA-蓝桥杯-算法训练-字符串变换
    Ceph:一个开源的 Linux PB 级分布式文件系统
    shell 脚本监控程序是否正在执行, 如果没有执行, 则自动启动该进程
  • 原文地址:https://www.cnblogs.com/wunaozai/p/3753415.html
Copyright © 2011-2022 走看看