通过域名获取IP地址

来源:互联网 发布:大赢通软件下载 编辑:程序博客网 时间:2024/04/28 03:05

域名仅仅是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.comAliases 1 : www.baidu.comAddress type : AF_INETAP addr 1:220.181.111.188AP addr 2:220.181.112.244[root@h ~]# ./host gbk.sms.webchinese.cnAddress type : AF_INETAP addr 1:219.235.3.148[root@h ~]# 
0 0