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

来源:百度文库 编辑:神马文学网 时间:2024/05/02 00:09:57
使用这个东西,首先要包含2个头文件:
#include  
#include  
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  
#include  
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;
}