通过域名获取IP地址
2016-05-22 09:35
387 查看
域名仅仅是IP地址的一个助记符,目的是方便记忆,通过域名并不能找到目标计算机,通信之前必须要将域名转换成IP地址。
gethostbyname() 函数可以完成这种转换,它的原型为:
hostname 为主机名,也就是域名。使用该函数时,只要传递域名字符串,就会返回域名对应的IP地址。返回的地址信息会装入 hostent 结构体,该结构体的定义如下:
从该结构体可以看出,不只返回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 结构体的特性:
运行结果:
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解析的故障解决方法
- python实现dnspod自动更新dns解析的方法
- 简述Windows系统名称解析过程(轉載)
- 关于CloudXNS注册邮箱为网易的处理办法
- 利用免费顶级域名,免费nat123域名解析服务,搭建免费企业邮箱
- Linux strace命令的妙用
- iOS开发之-- DNS解析(网络切换的问题解决)
- 网站建设(2)——DNS及DNS解析
- DNS解析与域名服务安全防护策略
- DNS解析全过程
- 部署DNS之辅助区域
- DNS解析
- ssh
- 电脑能ping通外网,解析域名也正常,上不了网?
- linux中建立网站服务器详解 推荐
- 日记 [2007年05月25日]DNS解析问题
- MDaemon退信分析:553 MI:SUM
- C#实现DNS解析服务
- DNS服务器之主从服务搭建
- Linux dig