使用gethostbyname由域名或主机名得IP地址


使用这个东西,首先要包含2个头文件: 
#include   <netdb.h> 
#include   <sys/socket.h> 

struct   hostent   *gethostbyname(const   char   *name); 
这个函数的传入值是域名或者主机名,例如 "www.google.com ", "wpc "等等。 
传出值,是一个hostent的结构(如下)。如果函数调用失败,将返回NULL。 

struct   hostent   { 
    char     *h_name; 
    char     **h_aliases; 
    int       h_addrtype; 
    int       h_length; 
    char     **h_addr_list; 
    }; 
解释一下这个结构: 
其中, 
    char   *h_name   表示的是主机的规范名。例如www.google.com的规范名其实是www.l.google.com。 
    char       **h_aliases   表示的是主机的别名。www.google.com就是google他自己的别名。有的时候,有的主机可能有好几个别名,这些,其实都是为了易于用户记忆而为自己的网站多取的名字。 
    int       h_addrtype   表示的是主机ip地址的类型,到底是ipv4(AF_INET),还是ipv6(AF_INET6) 
    int       h_length   表示的是主机ip地址的长度 
    int       **h_addr_lisst   表示的是主机的ip地址,注意,这个是以网络字节序存储的。千万不要直接用printf带%s参数来打这个东西,会有问题的哇。所以到真正需要打印出这个IP的话,需要调用inet_ntop()。 

const   char   *inet_ntop(int   af,   const   void   *src,   char   *dst,   socklen_t   cnt)   : 
这个函数,是将类型为af的网络地址结构src,转换成主机序的字符串形式,存放在长度为cnt的字符串中。 
这个函数,其实就是返回指向dst的一个指针。如果函数调用错误,返回值是NULL。 

  

下面是例程,有详细的注释。 

#include   <netdb.h> 
#include   <sys/socket.h> 

int   main(int   argc,   char   **argv) 

  char   *ptr,**pptr; 
  struct   hostent   *hptr; 
  char   str[32]; 
  /*   取得命令后第一个参数,即要解析的域名或主机名   */ 
  ptr   =   argv[1]; 
  /*   调用gethostbyname()。调用结果都存在hptr中   */ 
  if(   (hptr   =   gethostbyname(ptr)   )   ==   NULL   ) 
  { 
    printf( "gethostbyname   error   for   host:%s\n ",   ptr); 
    return   0;   /*   如果调用gethostbyname发生错误,返回1   */ 
  } 
  /*   将主机的规范名打出来   */ 
  printf( "official   hostname:%s\n ",hptr-> h_name); 
  /*   主机可能有多个别名,将所有别名分别打出来   */ 
  for(pptr   =   hptr-> h_aliases;   *pptr   !=   NULL;   pptr++) 
    printf( "     alias:%s\n ",*pptr); 
  /*   根据地址类型,将地址打出来   */ 
  switch(hptr-> h_addrtype) 
  { 
    case   AF_INET: 
    case   AF_INET6: 
      pptr=hptr-> h_addr_list; 
      /*   将刚才得到的所有地址都打出来。其中调用了inet_ntop()函数   */ 
      for(;*pptr!=NULL;pptr++) 
        printf( "     address:%s\n ",   inet_ntop(hptr-> h_addrtype,   *pptr,   str,   sizeof(str))); 
      break; 
    default: 
      printf( "unknown   address   type\n "); 
      break; 
  } 
  return   0; 


你可能感兴趣的:(网络,struct,list,Google,null,DST)