使用gethostbyname_r得到dns信息

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

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

下面是它用法的简单例子

CODE

#include <netdb.h>
 #include <stdio.h>
 #include <netinet/in.h>
 
 #define DUMP(...)   printf(__VA_ARGS__)
 int main(int argc,char** argv)
- {
|     char    buf[1024];
|     struct  hostent hostinfo,*phost;
|     int     ret;
|
|     DUMP("argc:%d/n",argc);
-     if(argc <2 ){
2         printf("ERROR:test domainname/n");
2         return 1;
2     }
|
|     if(gethostbyname_r(argv[1],&hostinfo,buf,sizeof(buf),&phost,&ret))
|         printf("ERROR:gethostbyname(%s) ret:%d,phost:%d/n",argv[1],ret,(int)ph
| ost);
-     else{
2         int i;
       printf("gethostbyname(%s) success:ret:%d,",argv[1],ret);
2         if(phost)
2             printf("phost(%d):name:%s,addrtype:%d(AF_INET:%d),len:%d,addr[0]:%
2 d,[1]:%d/n",        
2                     (int)phost,phost->h_name,phost->h_addrtype,AF_INET,
2                     phost->h_length,
2                     (int)phost->h_addr_list[0],
2                     phost->h_addr_list[0] == NULL?0
2                     :(int)phost->h_addr_list[1]);
2         for(i = 0;hostinfo.h_aliases[i];i++)
2             printf("host(%d) alias is:%s/n",(int)&hostinfo,hostinfo.h_aliases[
2 i]);
2         for(i = 0;hostinfo.h_addr_list[i];i++)
2             printf("host addr is:%s/n",inet_ntoa(*(struct in_addr*)hostinfo.h_
2 addr_list[i]));
2     }
|
|     return 0;
| }




程序结果如下

CODE

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



hostent结构定义及说明如下

CODE

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


当h_addrtype == 4时,h_addr_list返回的就是 in_addr类型的值,可以使用inet_ntoa把它转换成ip字符串

 

 

 

 

 

http://bbs.loveunix.net/viewthread.php?tid=36118&extra=&ordertype=1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值