程序员必知:【转】adns解析库——域名解析实例(C++、linux)

简介: 程序员必知:【转】adns解析库——域名解析实例(C++、linux)

转自:

adns是一个开源的dns解析库

官方文档:

1. 初始化

?adns_state adns;adns_query query;adns_answer answer; 函数原型:int adns_init(adns_state newstate_r, adns_initflags flags, FILE diagfile /0=>stderr/); 举例:adns_init(adns, adns_if_noenv, 0);

2. 提交待解析的域名

?函数原型:int adns_submit(adns_state ads, const char owner, adns_rrtype type, adns_queryflags flags, void context, adns_query query_r); 举例:adns_submit(adns, argv【1】, adns_r_a, (adns_queryflags) 0, NULL, query);

3. 检测是否有域名已检测完成

?函数原型:int adns_check(adns_state ads, adns_query query_io, adns_answer answer_r, void context_r); 例:adns_check(adns, query, answer, NULL);

4.

?函数原型:int adns_wait(adns_state ads, adns_query query_io, adns_answer answer_r, void context_r); 例:adns_wait(adns, query, answer, NULL);

5. 检测是否已完成所有提交的域名的解析

?函数原型:void adns_finish(adns_state ads); 例:adns_finish(adns);

6. 范例代码(解析IPv4地址可使用adns v1.2或adns v1.4,解析IPv6地址请使用adns v1.6)

可从此处下载:

?#include "adns.h" #include #include #include #include int test_dns(char host) { adns_state ads; adns_initflags flags; flags = adns_if_nosigpipe | adns_if_noerrprint; adns_init(ads, flags, NULL); adns_query quer = NULL; adns_submit(ads, host, (adns_rrtype) adns_r_a, (adns_queryflags) 0, NULL, quer); int tryCount = -1; int adns_cname = 0; while(tryCount < 32) { tryCount += 1; adns_answer ans; int res = adns_check(ads, quer, ans, NULL); if(res == 0) { if (ans->status == adns_s_prohibitedcname) { char cname【128】; strncpy(cname, ans->cname, 127); cname【strlen(ans->cname)】 = '\0'; adns_query quer = NULL; adns_submit(ads, cname, (adns_rrtype) adns_r_addr, (adns_queryflags) 0, NULL, quer); adns_cname = 1; } else { //resolve IPv4 address /          if(adns_cname) printf("ip: %s\n", ans->status == adns_s_ok ? inet_ntoa(ans->rrs.addr->addr.inet.sin_addr) : "no"); else printf("ip: %s\n", ans->status == adns_s_ok ? inet_ntoa((ans->rrs.inaddr)) : "no"); / //resolve IPv6 address if(adns_cname){ if(ans->status == adns_s_ok){ char buf【INET6_ADDRSTRLEN】; inet_ntop(AF_INET6, ans->rrs.addr->addr.inet6.sin6_addr, buf, sizeof(buf)); printf("ip: %s\n", buf); } else{ printf("no\n"); } } else{ if(ans->status == adns_s_ok){ char buf【INET6_ADDRSTRLEN】; inet_ntop(AF_INET6, ans->rrs.in6addr, buf, sizeof(buf)); printf("ip: %s\n", buf); } else{ printf("no\n"); } }//代码效果参考:http://www.ezhiqi.com/bx/art_7661.html adns_finish(ads); break; } } else if (res == ESRCH || res == EAGAIN) { sleep(1); } else { printf("host(%s) is err!\n", host); } } return 0; } int main(int argc, char argv【】) { char host【128】; while(1) { scanf("%s", host); if(strlen(host) == 3 strcmp(host, "eof")) break; test_dns(host); }//代码效果参考:http://www.ezhiqi.com/zx/art_1206.html return 0; }

Makefile

?CFLAGS= -g TARGETS=libadns.a LIBOBJS=types.o event.o query.o reply.o general.o setup.o transmit.om parse.o poll.o check.o all: testdns testdns: testdns.c libadns.a libadns.a: $(LIBOBJS) rm -f $@ $(AR) cq $@ $(LIBOBJS) clean: rm -f $(LIBOBJS) libadns.a *~ config.status distclean: clean rm -f config.h .depend $(LIBOBJS): adns.h internal.h config.h

相关文章
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
网络协议 Unix Linux
深入解析:Linux网络配置工具ifconfig与ip命令的全面对比
虽然 `ifconfig`作为一个经典的网络配置工具,简单易用,但其功能已经不能满足现代网络配置的需求。相比之下,`ip`命令不仅功能全面,而且提供了一致且简洁的语法,适用于各种网络配置场景。因此,在实际使用中,推荐逐步过渡到 `ip`命令,以更好地适应现代网络管理需求。
1200 113
|
存储 编译器 Linux
动态链接的魔法:Linux下动态链接库机制探讨
本文将深入探讨Linux系统中的动态链接库机制,这其中包括但不限于全局符号介入、延迟绑定以及地址无关代码等内容。
2598 141
|
域名解析 存储 缓存
深入学习 DNS 域名解析
在平时工作中相信大家都离不开 DNS 解析,因为 DNS 解析是互联网访问的第一步,无论是使用笔记本浏览器访问网络还是打开手机APP的时候,访问网络资源的第一步必然要经过DNS解析流程。
1913 31
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
1766 29
|
存储 监控 算法
基于 C++ 哈希表算法的局域网如何监控电脑技术解析
当代数字化办公与生活环境中,局域网的广泛应用极大地提升了信息交互的效率与便捷性。然而,出于网络安全管理、资源合理分配以及合规性要求等多方面的考量,对局域网内计算机进行有效监控成为一项至关重要的任务。实现局域网内计算机监控,涉及多种数据结构与算法的运用。本文聚焦于 C++ 编程语言中的哈希表算法,深入探讨其在局域网计算机监控场景中的应用,并通过详尽的代码示例进行阐释。
385 4
|
Linux 编译器 vr&ar
Linux的动态库与静态库
静态库在编译时直接嵌入到最终的可执行文件中。
356 0
|
监控 Shell Linux
Android调试终极指南:ADB安装+多设备连接+ANR日志抓取全流程解析,覆盖环境变量配置/多设备调试/ANR日志分析全流程,附Win/Mac/Linux三平台解决方案
ADB(Android Debug Bridge)是安卓开发中的重要工具,用于连接电脑与安卓设备,实现文件传输、应用管理、日志抓取等功能。本文介绍了 ADB 的基本概念、安装配置及常用命令。包括:1) 基本命令如 `adb version` 和 `adb devices`;2) 权限操作如 `adb root` 和 `adb shell`;3) APK 操作如安装、卸载应用;4) 文件传输如 `adb push` 和 `adb pull`;5) 日志记录如 `adb logcat`;6) 系统信息获取如屏幕截图和录屏。通过这些功能,用户可高效调试和管理安卓设备。
11628 2
|
消息中间件 Linux C++
c++ linux通过实现独立进程之间的通信和传递字符串 demo
的进程间通信机制,适用于父子进程之间的数据传输。希望本文能帮助您更好地理解和应用Linux管道,提升开发效率。 在实际开发中,除了管道,还可以根据具体需求选择消息队列、共享内存、套接字等其他进程间通信方
530 16
|
缓存 并行计算 Linux
深入解析Linux操作系统的内核优化策略
本文旨在探讨Linux操作系统内核的优化策略,包括内核参数调整、内存管理、CPU调度以及文件系统性能提升等方面。通过对这些关键领域的分析,我们可以理解如何有效地提高Linux系统的性能和稳定性,从而为用户提供更加流畅和高效的计算体验。
834 24