您的位置:首页 > 其它

通过域名获取IP地址

2016-05-22 09:35 387 查看
域名仅仅是IP地址的一个助记符,目的是方便记忆,通过域名并不能找到目标计算机,通信之前必须要将域名转换成IP地址。

gethostbyname() 函数可以完成这种转换,它的原型为:

#include <netdb.h>
struct hostent *gethostbyname(const char *hostname);


hostname 为主机名,也就是域名。使用该函数时,只要传递域名字符串,就会返回域名对应的IP地址。返回的地址信息会装入 hostent 结构体,该结构体的定义如下:

struct hostent{
char *h_name;  //official name
char **h_aliases;  //alias list
int  h_addrtype;  //host address type
int  h_length;  //address lenght
char **h_addr_list;  //address list
}


从该结构体可以看出,不只返回IP地址,还会附带其他信息,各位读者只需关注最后一个成员 h_addr_list。下面是对各成员的说明:

h_name:官方域名(Official domain name)。官方域名代表某一主页,但实际上一些著名公司的域名并未用官方域名注册。

h_aliases:别名,可以通过多个域名访问同一主机。同一IP地址可以绑定多个域名,因此除了当前域名还可以指定其他域名。

h_addrtype:gethostbyname() 不仅支持 IPv4,还支持 IPv6,可以通过此成员获取IP地址的地址族(地址类型)信息,IPv4 对应 AF_INET,IPv6 对应 AF_INET6。

h_length:保存IP地址长度。IPv4 的长度为4个字节,IPv6 的长度为16个字节。

h_addr_list:这是最重要的成员。通过该成员以整数形式保存域名对应的IP地址。对于用户较多的服务器,可能会分配多个IP地址给同一域名,利用多个服务器进行均衡负载。

hostent 结构体变量的组成如下图所示:

下面的代码主要演示 gethostbyname() 的应用,并说明 hostent 结构体的特性:

#include <stdio.h>
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main(int argc, char ** argv)
{
struct hostent *host;
host = gethostbyname(argv[1]);
if(host == NULL) {
printf("Get IP address error");
return -1;
}

int i = 0;

for (; host->h_aliases[i]; i++) {
printf("Aliases %d : %s\n", i+1, host->h_aliases[i]);
}

printf("Address type : %s\n", (host->h_addrtype==AF_INET)?"AF_INET":"AF_INET6");

for (i=0; host->h_addr_list[i]; i++) {
printf("AP addr %d:%s\n", i+1, inet_ntoa(*(struct in_addr*)(host->h_addr_list[i])));
}

return 0;
}


运行结果:

[root@h ~]# ./host www.baidu.com
Aliases 1 : www.baidu.com
Address type : AF_INET
AP addr 1:220.181.111.188
AP addr 2:220.181.112.244
[root@h ~]# ./host gbk.sms.webchinese.cn
Address type : AF_INET
AP addr 1:219.235.3.148
[root@h ~]#
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  DNS解析