在网络开发中 经常出现需要从主机名得到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