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

如何将域名转换为ip

2017-11-22 14:50 666 查看
一,前言

这篇文章主要讲述了如何将域名如“www.baidu.com”转换为类似“127.0.0.1”的IP地址,转换的过程主要使用了DNS协议相关的内容,但我们的重点并不是这里,有兴趣的可自行了解。我主要讲的是如何使用,主要包括以下几个内容:

1,hostent结构体

2,gethostbyname函数的用法

以上内容全都是在Linux环境里。

二,详细内容

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地址可能有多个,这也不难理解,如果你有多个网卡,你的IP地址自然也是有多个,但它们实际却都是指向你的。

另外还有一个定义h_addr它是一个指针,它指向h_addr_list[0],其实大部分时候我们只需要一个IP地址就够了,所以没必要知道那么多它的别名,需要注意的是这里的IP都是二进制的形式,它不是我们常见的点分十进制形式,所以如果直接打印可能会带来疑惑。

2,gethostbyname函数

它所在头文件:

sys/socket.h

netdb.h

//这里之所以不用include那种形式是因为带上‘#’markdown字体将会变大,所以见谅。

函数原型:

hosten* gethostbyname(const char* hostname);

它返回一个结构体的指针,如果没有找到“hostname”,将会返回NULL。

接下来请看其使用:

2.1

#include<stdio.h>
#include<netdb.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<stdlib.h>
#include<string.h>
int main(int argc,char* argv[])
{
char* ptr,**pptr;
struct hostent* hptr;
char str[32];
ptr=argv[1];
if((hptr=gethostbyname(ptr))==NULL)
{
perror("gethostbyname");
return -1;
}
printf("offical hostname:%s\n",hptr->h_name);
for(pptr=hptr->h_aliases;*pptr!=NULL;pptr++)
{
printf("alias:%s\n",*pptr);
}
pptr=hptr->h_addr_list;
for(;*pptr!=NULL;pptr++)
{
printf("address:%s\n",inet_ntop(hptr->h_addrtype,*pptr,str,sizeof(str)));
}
return 0;
}


上述代码的功能主要是用户给定一个域名,然后打印出它的别名,以及它的所有IP地址。

其中inet_ntop函数是将网络字节序转为点分十进制形式。

请看运行结果:



经过编译之后,我们发现淘宝网的正式名称其实是那一长串,而它的别名才是我们熟悉的那个。

2.2 h_addr的使用

我们已经知道,h_addr是一个域名众多IP地址中的一个,但是因为它是二进制形式,所以在使用时是可以直接使用的,如下:

#include<stdio.h>
#include<netdb.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<stdlib.h>
#include<string.h>
int main(int argc,char* argv[])
{
//char* ptr,**pptr;
struct hostent* hptr;
//char str[32];
ptr=argv[1];
if((hptr=gethostbyname(ptr))==NULL)
{
perror("gethostbyname");
return -1;
}
/* printf("offical hostname:%s\n",hptr->h_name);
for(pptr=hptr->h_aliases;*pptr!=NULL;pptr++)
{
printf("alias:%s\n",*pptr);
}
pptr=hptr->h_addr_list;
for(;*pptr!=NULL;pptr++)
{
printf("address:%s\n",inet_ntop(hptr->h_addrtype,*pptr,str,sizeof(str)));

}*/
struct in_addr myaddr;
memcpy(&myaddr.s_addr,hptr->h_addr,sizeof(hptr->h_addr));
printf("address:%s\n",inet_ntoa(myaddr));
//printf("address:%s\n",inet_ntop(hptr->h_addrtype,ptr,str,sizeof(str)));
return 0;
}


结果:



三,结论

遇到困难,搞了半天才弄明白了,记录下来,方便自己,也留给需要的有缘人吧,综上。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  域名 linux