大宇私人领地伊甸园丨宁愿做了后悔,也不要错过后悔[www.mrdayu.com]
注册

24小时联系邮箱:[email protected]

编程人生
您现在的位置: 首页 > 编程人生 > C/C++语言 > [C/C++]DNS解析

[C/C++]DNS解析

发布时间:2017/11/09 C/C++语言 标签dns解析浏览次数:88

引:

人们习惯记忆域名,但机器间互相只认IP地址,域名与IP地址之间是多对一的关系,一个ip地址不一定只对应一个域名,且一个域名只可以对应一个ip地址,它们之间的转换工作称为域名解析,域名解析需要由专门的域名解析服务器来完成,整个过程是自动进行的。

原理:

对于站长来说:
当你的网站制作完成后上传到你的虚拟机时,你可以直接在浏览器中输入IP地址浏览你的网站,也可以输入域名查询你的网站,虽然得出的内容是一样的但是调用的过程不一样,输入IP地址是直接从主机上调用内容,输入域名是通过域名解析服务器指向对应的主机的IP地址,再从主机调用网站的内容。
对于普通用户来说:
当你在浏览器输入www.baidu.com,计算机听不懂也看不懂www.baidu.com这是个什么地址,他就会调用DNS解析技术,将www.baidu.com转换成计算机能懂的IP地址,通过一系列协议进行BS系列通信,也就是之后会提到的HTTP协议。

实现:

gethostbyname()函数说明——用域名或主机名获取IP地址:

首先我们在linux/GUN发行版的任何一个版本下输入:
man 3 gethostbyname,我们会得到如下信息

我们使用此函数必须包含头文    #include <netdb.h>
附(选择添加):#include <sys/socket.h>
函数原型
struct hostent *gethostbyname(const char *name);
行参:
name
这个函数的传入值是域名或者主机名,例如”www.baidu,com”等等。
返回值:
成功:访问类型为struct hostent结构体类型的指针
失败:返回NULL

返回hostent结构体类型指针

struct hostent
{
char     *h_name;
char     **h_aliases;
int        h_addrtype;
int        h_length;
char     **h_addr_list;
#define h_addr h_addr_list[0]
};

hostent->h_name
表示的是主机的规范名。例如www.google.com的规范名其实是www.l.google.com。
hostent->h_aliases
表示的是主机的别名.www.google.com就是google他自己的别名。有的时候,有的主机可能有好几个别名,这些,其实都是为了易于用户记忆而为
自己的网站多取的名字。
hostent->h_addrtype
表示的是主机ip地址的类型,到底是ipv4(AF_INET),还是pv6(AF_INET6)
hostent->h_length
表示的是主机ip地址的长度
hostent->h_addr_lisst
表示的是主机的ip地址,注意,这个是以网络字节序存储的。千万不要直接用printf带%s参数来打这个东西,会有问题的哇。所以到真正需要打印出
这个IP的话,需要调用inet_ntop()。

附:
const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt) :
这个函数,是将类型为af的网络地址结构src,转换成主机序的字符串形式,存放在长度为cnt的字符串中。返回指向dst的一个指针。

函数实现DNS解析并标准输出功能:

功能测试:

56.2K

您好!请登录

合作网站快捷登录:
点击取消回复

已有0评论

    购物盒子

    点击这里给我发消息点击这里给我发消息