LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 3403|回复: 0

使用gethostbyname_r得到dns信息

[复制链接]
发表于 2004-8-5 23:14:52 | 显示全部楼层 |阅读模式
无双 loveunix.net 原创,转载保留出处

在网络开发中 经常出现需要从主机名得到ip地址的情况 这时就使用gethostbyname
但是因为gethostbyname返回的是一个指向静态变量的指针 不可重入
很可能刚要读时值就被其它线程修改

所以 新的posix中增加了另一个可重入的从主机名(域名)得到DNS的孙数
gethostbyname_r

下面是它用法的简单例子


代码

  1. #include <netdb.h>
  2. #include <stdio.h>
  3. #include <netinet/in.h>

  4. #define DUMP(...)   printf(__VA_ARGS__)
  5. int main(int argc,char** argv)
  6. {
  7.      char    buf[1024];
  8.      struct  hostent hostinfo,*phost;
  9.      int     ret;

  10.      DUMP("argc:%d\n",argc);
  11.      if(argc <2 ){
  12.          printf("ERROR:test domainname\n");
  13.          return 1;
  14.      }

  15.      if(gethostbyname_r(argv[1],&hostinfo,buf,sizeof(buf),&phost,&ret))
  16.          printf("ERROR:gethostbyname(%s) ret:%d,phost:%d\n",argv[1],ret,(int)phost);
  17.      else{
  18.          int i;
  19.        printf("gethostbyname(%s) success:ret:%d,",argv[1],ret);
  20.          if(phost)
  21.              printf("phost(%d):name:%s,addrtype:%d(AF_INET:%d),len:%d,addr[0]:%d,[1]:%d\n",        
  22.                      (int)phost,phost->h_name,phost->h_addrtype,AF_INET,
  23.                      phost->h_length,
  24.                      (int)phost->h_addr_list[0],
  25.                      phost->h_addr_list[0] == NULL?0
  26.                      :(int)phost->h_addr_list[1]);
  27.          for(i = 0;hostinfo.h_aliases[i];i++)
  28.              printf("host(%d) alias is:%s\n",(int)&hostinfo,hostinfo.h_aliases[i]);
  29.          for(i = 0;hostinfo.h_addr_list[i];i++)
  30.              printf("host addr is:%s\n",inet_ntoa(*(struct in_addr*)hostinfo.h_
  31. addr_list[i]));
  32.      }

  33.      return 0;
  34. }

复制代码



程序结果如下
代码

  1. wushuang:/var/www#  ~/work/test/test [url]www.google.com[/url]
  2. argc:2
  3. gethostbyname([url]www.google.com[/url]) success:ret:0,phost(-1073744112):name:[url]www.google.akadns.net,addrtype:2[/url](AF_INET:2),len:4,addr[0]:-1073743784,[1]:0
  4. host(-1073744112) alias is:[url]www.google.com[/url]
  5. host addr is:64.233.161.104
  6. wushuang:/var/www#

复制代码


hostent结构定义及说明如下
代码

  1.              struct hostent {
  2.                      char    *h_name;        /* official name of host */
  3.                      char    **h_aliases;    /* alias list 主机别名*/
  4.                      int     h_addrtype;     /* host address type 地址类型,现在是AF_INET(IPV4)或AF_INET6(IPV6)*/
  5.                      int     h_length;       /* length of address 每个地址的长度,当addrtype == AF_INET时这里是4*/
  6.                      char    **h_addr_list;  /* list of addresses 址址列表,最后一个是NULL*/
  7.              }
  8.              #define h_addr  h_addr_list[0]  /* for backward compatibility */

复制代码

当h_addrtype == 4时,h_addr_list返回的就是 in_addr类型的值,可以使用inet_ntoa把它转换成ip字符串
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表