打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
使用GETHOSTBYNAME由域名或主机名得IP地址
userphoto

2010.10.13

关注
使用这个东西,首先要包含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;
}
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
struct hostent结构体
gethostbyname()函数详解
如何打印hostent结构体中的所有数据
关于gethostbyname多线程阻塞的处理方法
获取主机的IP信息
关于用gethostbyname得域名(www.baidu.com)的IP问题
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服