超级好用的C++实用库之DNS解析

简介: 超级好用的C++实用库之DNS解析

概述

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表示成功,其他表示错误码。



相关文章
|
4月前
|
API C++ Windows
Visual C++运行库、.NET Framework和DirectX运行库的作用及常见问题解决方案,涵盖MSVCP140.dll丢失、0xc000007b错误等典型故障的修复方法
本文介绍Visual C++运行库、.NET Framework和DirectX运行库的作用及常见问题解决方案,涵盖MSVCP140.dll丢失、0xc000007b错误等典型故障的修复方法,提供官方下载链接与系统修复工具使用指南。
1014 2
|
4月前
|
缓存 算法 程序员
C++STL底层原理:探秘标准模板库的内部机制
🌟蒋星熠Jaxonic带你深入STL底层:从容器内存管理到红黑树、哈希表,剖析迭代器、算法与分配器核心机制,揭秘C++标准库的高效设计哲学与性能优化实践。
C++STL底层原理:探秘标准模板库的内部机制
|
4月前
|
Ubuntu API C++
C++标准库、Windows API及Ubuntu API的综合应用
总之,C++标准库、Windows API和Ubuntu API的综合应用是一项挑战性较大的任务,需要开发者具备跨平台编程的深入知识和丰富经验。通过合理的架构设计和有效的工具选择,可以在不同的操作系统平台上高效地开发和部署应用程序。
213 11
|
4月前
|
IDE 编译器 开发工具
msvcp100.dll,msvcp120.dll,msvcp140.dll,Microsoft Visual C++ 2015 Redistributable,Visual C++ 运行库安装
MSVC是Windows下C/C++开发核心工具,集成编译器、链接器与调试器,配合Visual Studio使用。其运行时库(如msvcp140.dll)为程序提供基础函数支持,常因缺失导致软件无法运行。通过安装对应版本的Microsoft Visual C++ Redistributable可解决此类问题,广泛应用于桌面软件、游戏及系统级开发。
585 2
|
5月前
|
并行计算 C++ Windows
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
11月前
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
1107 29
|
10月前
|
存储 监控 算法
基于 C++ 哈希表算法的局域网如何监控电脑技术解析
当代数字化办公与生活环境中,局域网的广泛应用极大地提升了信息交互的效率与便捷性。然而,出于网络安全管理、资源合理分配以及合规性要求等多方面的考量,对局域网内计算机进行有效监控成为一项至关重要的任务。实现局域网内计算机监控,涉及多种数据结构与算法的运用。本文聚焦于 C++ 编程语言中的哈希表算法,深入探讨其在局域网计算机监控场景中的应用,并通过详尽的代码示例进行阐释。
215 4
|
安全 编译器 C语言
【C++篇】深度解析类与对象(中)
在上一篇博客中,我们学习了C++类与对象的基础内容。这一次,我们将深入探讨C++类的关键特性,包括构造函数、析构函数、拷贝构造函数、赋值运算符重载、以及取地址运算符的重载。这些内容是理解面向对象编程的关键,也帮助我们更好地掌握C++内存管理的细节和编码的高级技巧。

推荐镜像

更多
  • DNS