如何将域名转化为IP
这篇文章主要讲述了如何将域名如“www.baidu.com”转换为类似“127.0.0.1”的IP地址,转换的过程主要使用了DNS协议相关的内容
1、hostent结构体说明
1,hostent结构体
struct hostent
{
char * h_name;
char ** alias_list;
int h_addrtype;
int h_length;
char ** h_addr_list;
};
h_name:主机的规范名,如“www.baidu.com”,它的规范名其实是“www.a.shifen.com”,这一点可以通过ping命令得到。
alisa_list:这是主机的别名,它是一个二级指针,这是因为主机的别名有可能有好几个。
h_addrtype:指主机的IP地址类型,到底是IPV4还是IPV6。
h_length:指主机的IP地址长度。
h_addr_list:它也是一个二级指针,它主要指向主机IP地址数组的指针,这是因为一个主机它的IP地址可能有多个
2、函数原型
函数原型:
hosten* gethostbyname(const char* hostname);
Unix/Linux下的gethostbyname函数常用来向DNS查询一个域名的IP地址。 由于DNS的递归查询,常常会发生gethostbyname函数在查询一个域名时严重超时,因此我们可以把gethostbyname封装成一个命令
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <netdb.h>
#include <signal.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define LEN64 64
#define ALARM_TIMEOUT (10)
static void show_help(void)
{
printf("usage: gethostbyname <domain name>\n");
printf("example:\n");
printf("\tgethostbyname www.baidu.com\n");
}
static void alarm_timeout()
{
fprintf(stderr, "timeout %ds\n", ALARM_TIMEOUT);
exit(0);
}
int main(int argc, const char *argv[])
{
int len = 0;
char addr[LEN64];
char *ipstr = NULL;
char **paddr = NULL;
struct hostent *pdns;
signal(SIGALRM, alarm_timeout);
if (argc < 2)
{
show_help();
return -1;
}
len = strlen(argv[1]);
if (len >= LEN64) {
fprintf(stderr, "domain name is too big %d (> %d)\n", len, LEN64);
}
alarm(ALARM_TIMEOUT);
pdns = gethostbyname(argv[1]);
if(NULL == pdns)
{
perror("dns failed");
}
paddr = pdns->h_addr_list;
memset(addr, 0, LEN64);
for( ; *paddr != NULL; paddr++)
{
ipstr = inet_ntop(pdns->h_addrtype, *paddr, addr, sizeof(addr));
printf("%s\n", ipstr);
}
return 0;
}