librdns一个开源DNS解析库
原文地址:librdns一个开源DNS解析库 – 无敌牛
欢迎参观我的个人博客:无敌牛 – 技术/著作/典籍/分享等
介绍
librdns是一个开源的异步多功能插件式的解析器,用于DNS解析。
源代码地址:GitHub - vstakhov/librdns: Asynchronous DNS resolver
librdns使用libev和libevent的方式集成,来实现异步操作。
关于DNS相关知识参看往期文章:DNS记录这件小事 – 无敌牛
关于libev的介绍参看往期文章:libev监听IO事件 – 无敌牛
编译安装
下载源文件,指令:git clone https://github.com/vstakhov/librdns.git
编译,先进入拉取的源代码目录,然后执行:mkdir build && cd build && cmake .. && make -j 5
安装,主要是把编译后的so库和需要引用的头文件拿到系统目录。执行指令:cp lib* ../include/* /usr/local/include/
。然后重新加载系统动态库 ldconfig
测试示例
在 librdns 源代码里已经有两个测试文件,我这里做了一些修改,把获取到的数据打印了出来。代码如下:
trdns.c
// gcc -Wall -o test trdns.c -lev -lrdns#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>#include "rdns.h"
#include "rdns_curve.h"
#include "rdns_ev.h"#define LL_FOREACH_SAFE(head,el,tmp) \LL_FOREACH_SAFE2(head,el,tmp,next)#define LL_FOREACH_SAFE2(head,el,tmp,next) \for((el)=(head);(el) && (tmp = (el)->next, 1); (el) = tmp)static int remain_tests = 0;static void
rdns_regress_callback (struct rdns_reply *reply, void *arg)
{// 获取有多少个查询项unsigned int count ;const struct rdns_request_name* names = rdns_request_get_name (reply->request, &count);for( int i=0 ; i < count ; ++i ) {printf ("===========================\ncount %d host: %s type: %d result\n", count, names[i].name, names[i].type ) ;}// 判断是否获取DNS成功if(reply->code != RDNS_RC_NOERROR) {printf("failed code : %d\n", reply->code) ;if (--remain_tests == 0) {rdns_resolver_release (reply->resolver);}return ;}// 遍历返回的结果实体struct rdns_reply_entry *entry, *tmp ;LL_FOREACH_SAFE (reply->entries, entry, tmp) {switch (entry->type) {case RDNS_REQUEST_MX : // MX 结果printf("MX ===== record rslt is : %u %s\n", entry->content.mx.priority , entry->content.mx.name ) ;break ;case RDNS_REQUEST_A : // A 结果char ip_str[16] ;inet_ntop(AF_INET, &entry->content.a.addr, ip_str, sizeof(ip_str) ) ;printf("A ===== record rslt is : %s\n", ip_str) ;break ;case RDNS_REQUEST_TXT : // TXT 结果printf("TXT ===== rslt is : %s\n", entry->content.txt.data) ;break ;default :printf("wrong type : %u\n", entry->type) ;}}if (--remain_tests == 0) {// 减少 DNS解析服务器的引用,如果 为 0 则释放空间 // 同时会停止 libev 的 loop 循环rdns_resolver_release (reply->resolver);}
}static void
rdns_test_a (struct rdns_resolver *resolver)
{char *names[] = {"baidu.com","163.com","qq.com",NULL};char **cur;for (cur = names; *cur != NULL; cur ++) {// 增加检测结果回调函数// 参数: DNS解析句柄、解析结果回调函数、回调函数参数、DNS查询超时时间(单位:秒)、失败重复查询次数、总共要做多少个查询、请求值、类型、请求值、类型...// 坑:当添加多个查询的时候,会超时,所以这里一个一个添加rdns_make_request_full (resolver, rdns_regress_callback, NULL, 5.0, 2, 1, *cur, RDNS_REQUEST_A );remain_tests++ ;rdns_make_request_full (resolver, rdns_regress_callback, NULL, 5.0, 2, 1, *cur, RDNS_REQUEST_MX);remain_tests++ ;rdns_make_request_full (resolver, rdns_regress_callback, NULL, 5.0, 2, 1, *cur, RDNS_REQUEST_TXT);remain_tests++ ;}
}int
main(int argc, char **argv)
{struct rdns_resolver *resolver_ev;struct ev_loop *loop;// 创建 libev 监听轮询 loop 句柄loop = ev_default_loop (0);// 创建 DNS 解析器结构resolver_ev = rdns_resolver_new ();// 绑定 libev 的 loop 和 resolver_evrdns_bind_libev (resolver_ev, loop);// 增加 DNS服务器信息 : argv[1] IP地址 argv[2] 端口号rdns_resolver_add_server (resolver_ev, argv[1], strtoul (argv[2], NULL, 10), 0, 8);// 初始化 DNS 解析器rdns_resolver_init (resolver_ev);// 添加测试rdns_test_a (resolver_ev);ev_loop (loop, 0);return 0;
}
编译测试
指令:gcc -Wall -o test trdns.c -lev -lrdns
相关文章:

librdns一个开源DNS解析库
原文地址:librdns一个开源DNS解析库 – 无敌牛 欢迎参观我的个人博客:无敌牛 – 技术/著作/典籍/分享等 介绍 librdns是一个开源的异步多功能插件式的解析器,用于DNS解析。 源代码地址:GitHub - vstakhov/librdns: Asynchrono…...
Unity3D 逻辑服的Entity, ComponentData与System划分详解
前言 在Unity3D中,逻辑服(Entity, ComponentData和System)是一种非常高效的组件化设计模式,它可以帮助开发者更好地管理游戏中的实体和逻辑。本文将详细介绍Unity3D逻辑服的概念以及如何实现Entity、ComponentData和System的划分。 对惹,这…...

跟《经济学人》学英文:2024年11月23日这期 Why British MPs should vote for assisted dying
Why British MPs should vote for assisted dying A long-awaited liberal reform is in jeopardy in jeopardy:在危险中 jeopardy:美 [ˈdʒepərdi] 危险;危机;风险; 原文: THIS NEWSPAPER believes …...

基于阿里云服务器部署静态的website
目录 一:创建服务器实例并connect 二:本地文件和服务器share 三:关于IIS服务器的安装预配置 四:设置安全组 五:建站流程 六:关于备案 一:创建服务器实例并connect 创建好的服务器实例在云…...

【2024 Optimal Control 16-745】Ubuntu22.04 安装Julia
找不到Julia 内核 下载Julia curl -fsSL https://install.julialang.org | sh官网下载:Julia 安装 IJulia 打开 Julia REPL(在终端中输入 julia)并执行以下命令安装 IJulia: using Pkg Pkg.add("IJulia")这将为 Ju…...
nuget默认包管理格式:packages.config、packageReference区别
packages.config 和 PackageReference 是 NuGet 中的两种包管理格式,各有优劣,适用于不同的场景。以下是它们的详细对比: 1. packages.config 格式 这是 NuGet 的传统包管理格式,早期版本使用的默认方法。 特点 依赖声明文件&…...
element-plus教程:Input Number 数字输入框
一、基础用法 要使用Input Number数字输入框,只需要在<el-input-number>元素中使用v-model绑定变量即可。例如: <template><el-input-number v-model"value" /> </template><script lang"ts" setup>…...

M|横道世之介
rating: 8.0 豆瓣: 8.8 上映时间: “2013” 类型: M剧情爱情 导演: 冲田修一 Shichi Okita 主演: 冲田修一 Shichi Okita吉高由里子 Yuriko Yoshitaka 国家/地区: 日本 片长/分钟: 160分钟 M|横道世之介 横道世之介是一个热情、纯真的人,大家…...

借助算力云跑模型
算力平台:FunHPC | 算力简单易用 AI乐趣丛生 该文章只讲述了最基本的使用步骤(因为我也不熟练)。 【注】:进入平台,注册登录账号后,才能租用。学生认证+实名认证会有免费的算力资源࿰…...

LlamaIndex+本地部署InternLM实践
LlamaIndex本地部署InternLM实践 XTuner是一个调整模型参数的小工具,通过对于给定的大模型输入有限的参数来调整同类型问题的结果输出 LlamaIndex是一个将大语言模型(LLMs)和外部数据连接在一起的工具,主要用于增强大模型的知识获取能力…...
3.12MayBeSomeJava
接受是否为负数,原双精度数,最大有效位数,固定显示位数 FD类里的把二进制数转为ASCII数,为CONVERT对象类型 然后调用CONVERT类里的舍入函数判断是否舍入 通过调用fdConverter的decimalDigitsExact方法,获取转换后的…...

设计模式之 命令模式
命令模式(Command Pattern)是行为型设计模式之一,它将请求(或命令)封装成一个对象,从而使用户能够将请求发送者与请求接收者解耦。通过命令模式,调用操作的对象与执行操作的对象不直接关联&…...

24.11.23 Ajax
1动态网页技术与静态网页技术对比: 静态网页: 如果数据库中有用户列表 html中要显示 如果用户列表数据变化 html要改代码才能显示完整数据 (不能使用动态数据 ) 动态网页: servlet可以通过代码 以输出流显示数据 当数据库数据改变时 不需要改代码 2.为了解决html不能使用动…...

Sickos1.1 详细靶机思路 实操笔记
Sickos1.1 详细靶机思路 实操笔记 免责声明 本博客提供的所有信息仅供学习和研究目的,旨在提高读者的网络安全意识和技术能力。请在合法合规的前提下使用本文中提供的任何技术、方法或工具。如果您选择使用本博客中的任何信息进行非法活动,您将独自承担…...
rk3568-linux-5.10.160移植rtl8822cs wifi 模块纪要
rk3568-linux-5.10.160移植rtl8822cs wifi 模块纪要 1、将驱动添加到 kernel/drivers/net/wireless/rockchip_wlan/ 或者 kernel/drivers/net/wireless/realtek/rtlwifi/ 2、修改该目录下的makefile、kconfig 3、修改rtl8822cs/os_dep/linux/os_intfs.c,添加 MO…...

QT基础 编码问题 定时器 事件 绘图事件 keyPressEvent QT5.12.3环境 C++实现
一、编码问题 在计算机编程中,流(Stream)是一种抽象的概念,用于表示数据的输入或输出。根据处理数据的不同方式,流可以分为字节流(Byte Stream)和字符流(Character Stream࿰…...
学习electron
一、开发环境 1、先行安装 node.js 和 npm 2、检查 Node.js 是否正确安装,请在您的终端输入以下命令:检测安装的版本 node -v npm -v 注意 因为 Electron 将 Node.js 嵌入到其二进制文件中,你应用运行时的 Node.js 版本与你系统中运…...
《C++智能合约与区块链底层交互全解析:构建坚实的去中心化应用桥梁》
在区块链技术的广阔天地里,C智能合约扮演着极为关键的角色,而其与区块链底层的交互则是实现各种去中心化应用功能的核心环节。深入理解并掌握这种交互机制,对于区块链开发者来说至关重要,它犹如一座桥梁,将智能合约的业…...

MySQL:事务
什么是事务 事务就是把SQL语句打包成一个整体,在这组SQL执行的时候,要么同时成功,要么同时失败。 事务的ACID特性 事务的ACID特性指的是 Atomicity (原⼦性), Consistency (⼀致性), Isolation (隔离 性)和 Durabi…...

Linux——进程间通信之管道
进程间通信之管道 文章目录 进程间通信之管道1. 进程间通信1.1 为什么要进行进程间的通信1.2 如何进行进程间的通信1.3 进程间通信的方式 2. 管道2.1 匿名管道2.1.1 系统调用pipe()2.1.2 使用匿名管道进行通信2.1.1 匿名管道四种情况2.1.2 匿名管道的五大特性2.1.3 进程池 2.2 …...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...

376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...

企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...

GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...

如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...