|
无双 loveunix.net 原创,转载保留出处
在网络开发中 经常出现需要从主机名得到ip地址的情况 这时就使用gethostbyname
但是因为gethostbyname返回的是一个指向静态变量的指针 不可重入
很可能刚要读时值就被其它线程修改
所以 新的posix中增加了另一个可重入的从主机名(域名)得到DNS的孙数
gethostbyname_r
下面是它用法的简单例子
代码
- #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 ){
- printf("ERROR:test domainname\n");
- return 1;
- }
- if(gethostbyname_r(argv[1],&hostinfo,buf,sizeof(buf),&phost,&ret))
- printf("ERROR:gethostbyname(%s) ret:%d,phost:%d\n",argv[1],ret,(int)phost);
- else{
- int i;
- printf("gethostbyname(%s) success:ret:%d,",argv[1],ret);
- if(phost)
- printf("phost(%d):name:%s,addrtype:%d(AF_INET:%d),len:%d,addr[0]:%d,[1]:%d\n",
- (int)phost,phost->h_name,phost->h_addrtype,AF_INET,
- phost->h_length,
- (int)phost->h_addr_list[0],
- phost->h_addr_list[0] == NULL?0
- :(int)phost->h_addr_list[1]);
- for(i = 0;hostinfo.h_aliases[i];i++)
- printf("host(%d) alias is:%s\n",(int)&hostinfo,hostinfo.h_aliases[i]);
- for(i = 0;hostinfo.h_addr_list[i];i++)
- printf("host addr is:%s\n",inet_ntoa(*(struct in_addr*)hostinfo.h_
- addr_list[i]));
- }
- return 0;
- }
复制代码
程序结果如下
代码
- wushuang:/var/www# ~/work/test/test [url]www.google.com[/url]
- argc:2
- 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
- host(-1073744112) alias is:[url]www.google.com[/url]
- host addr is:64.233.161.104
- wushuang:/var/www#
复制代码
hostent结构定义及说明如下
代码
- 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字符串 |
|