概述
dns(domain name system,域名系统)是一种分布式数据库服务,用于将人们容易记忆的域名与计算机网络中用于寻址和定位的ip地址进行映射。在互联网上,每一台设备都有一个唯一的ip地址。但由于ip地址通常是一串难以记忆的数字,因此dns系统应运而生,它提供了一种将人类可读的、具有一定逻辑结构的域名转换为ip地址的服务。
当用户在浏览器中输入一个网址时,实际上是触发了一个dns解析过程,这个过程包括如下步骤。
查询本地dns缓存:首先检查本机是否有该域名对应的ip地址记录。
递归查询:如果没有命中缓存,则请求发送到用户的isp提供的本地dns服务器,由本地dns服务器负责发起递归查询流程,逐级向上询问根域名服务器、顶级域名服务器以及权威域名服务器,直到找到目标域名的ip地址。
响应并缓存:一旦权威域名服务器返回了域名对应的ip地址,这个信息会沿着查询路径返回给用户,并被沿途的dns服务器缓存起来,以加快后续相同域名的查询速度。
chp_dns类
在c++中,获取dns域名对应的ip地址通常不直接通过编写原始的dns查询协议来实现(虽然理论上可以这样做),而是调用操作系统提供的网络库或api来进行解析。这是因为直接处理dns协议细节相当复杂且容易出错,而操作系统和标准库已经封装好了这些功能。
gethostbyname函数和getaddrinfo函数用于获取域名对应的ip地址,但这两个函数都是阻塞的。在非阻塞的使用场景下,直接使用这两个函数不太合适。为了方便应用层使用,我们封装了异步dns解析类chp_dns。chp_dns类是一个单实例类,从chp_basethread类派生。chp_dns类的头文件,可参考下面的示例代码。
#pragma once #include <string> #include <map> #include "hp_basethread.h" #include "hp_mutex.h" class chp_dns : public chp_basethread { public: static void open(); static chp_dns *&singleton(); static void close(); unsigned int fetchip(const char *pszip); void defetchip(const char *pszip); static int getip(const char *pszip, unsigned int &uiip); protected: chp_dns(); virtual ~chp_dns(); virtual unsigned int run(); private: typedef struct _tdnsinfo { _tdnsinfo() { uiip = 0; uilastgottick = 0; uilastactivetick = 0; } unsigned int uiip; unsigned int uilastgottick; unsigned int uilastactivetick; }tdnsinfo; typedef std::map<std::string, tdnsinfo> iptodnsinfomap; static chp_dns *m_pthis; iptodnsinfomap m_mapiptodnsinfo; bool m_bmapchanged; chp_mutex m_mutexmap; };
chp_dns类导出了两个实例成员函数和一个静态成员函数,下面分别进行介绍。
fetchip:非阻塞获取dns。参数pszip为ip地址或域名;返回值为0时,表示没有解析成功,需要继续调用本函数,其他表示解析成功的ip地址。
defetchip:取消非阻塞获取dns。当fetchip一直返回0,上层判断超时后,最好调用本接口进行释放。否则,底层会一直尝试去解析,进而影响其他地址的解析过程。参数pszip为ip地址或域名。
getip:阻塞获取dns,静态函数。参数pszip为ip地址或域名,参数uiip为解析成功的ip地址,返回值为0表示成功,其他表示错误码。
总结
dns解析是一种将域名(比如:www.example.com)转换为相应的ip地址(比如:192.168.1.100)的过程,这个过程是由dns服务器完成的。dns解析是互联网上的一个关键服务,它使得人们可以通过易记的域名来访问网站,而不需要记住复杂的ip地址。
总的来说,dns解析是互联网上的一个关键服务,它使得人们可以通过易记的域名来访问网站,而不需要记住复杂的ip地址。同时,dns解析也是分布式存储的,通过多个服务器之间的协作,实现了快速、准确的域名到ip地址的转换。
到此这篇关于c++实用库之dns解析的实现的文章就介绍到这了,更多相关c++ dns解析内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论