您的位置:首页 > 运维架构 > Linux

linux通过域名获取主机信息

2010-06-22 22:41 162 查看
参考 《linux网络编程》 宋敬彬 孙海滨 著

通过域名获取主机信息的方法很简单,用函数gethostbyname()就可以。

函数原型如下:

#include <netdb.h>

struct hostent *gethostbyname( const char *name)

gethostbyname()函数返回值是一个指向结构struct hostent 类型变量的指针,为NULL时发生错误。可以用

errno获得。

常见的错误类型如下:

HOST_NOT_FOUND: 查询的主机不可知

NO_ADDRESS , NO_DATA : 请求的名称合法但是没有合适的ip地址

NO_RECOVERY :域名服务器不响应

TRY_AGAIN:域名服务器当前出现临时性错误,稍候再试

结构struct hostent 的原型:

struct hostent

{

char *h_name; // 主机的正式名称

char **h_aliases; //主机别名列表

int h_addrtype; //主机地址类型

int h_length; // 地址长度

char **h_addr_list; //地址列表

}

具体如何获取主机信息代码如下:

#include <netdb.h>
#include <string.h>
#include <stdio.h>
int main (int argc,char *argv[])
{
struct hostent *ht=NULL;
if(argc==2)
{
ht = gethostbyname(argv[1]);
}
if (ht){
int i=0;
printf("主机正式名称 :%s/n",ht->h_name);
printf("主机地址类型:%s/n",ht->h_addrtype==AF_INET?"AF_INET":"AF_INET6");
printf("地址长度:%d字节/n",ht->h_length);
for(i=0;;i++)
{
if(ht->h_addr_list[i]!=NULL)
{
printf("IP:%s/n",inet_ntoa((unsigned int *)ht->h_addr_list[i]));
}
else break;
}
for(i=0;;i++)
{
if(ht->h_aliases[i]!=NULL)
{
printf("主机别名 %d:%s/n",i,ht->h_aliases[i]);
}
else break;
}
}
return 0;
}


我保存为g.c

运行结果如下:


./g www.csdn.net

主机正式名称 :www.csdn.net

主机地址类型:AF_INET

地址长度:4字节

IP:252.16.167.9

由于函数gethostbyname() 不可重入,它传出的值为一块静态的内存地址,当另一次调用后会覆盖前一次。所以每次调用之后必须马上将结果取出,不然会被覆盖。目前gethostbyname()已经不推荐使用,它有了替代函数即getaddrinfo。后者是线程安全的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: