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

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 程序员必知:【转】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

相关文章
|
27天前
|
域名解析 网络协议 安全
在Linux中,想在命令行下访问某个网站,并且该网站域名还没有解析,如何做?
在Linux中,想在命令行下访问某个网站,并且该网站域名还没有解析,如何做?
|
27天前
|
网络协议 Linux Docker
在Linux中,如何指定dns服务器,来解析某个域名?
在Linux中,如何指定dns服务器,来解析某个域名?
|
16天前
|
网络协议
DNS正向解析实现
文章介绍了DNS正向解析的实现,包括资源记录的定义、配置区域解析记录的步骤,并通过实际操作展示了如何为"yinzhengjie.com"域名配置DNS解析记录。
26 2
DNS正向解析实现
|
27天前
|
域名解析 存储 缓存
在Linux中,DNS进行域名解析的过程是什么?
在Linux中,DNS进行域名解析的过程是什么?
|
28天前
|
域名解析 网络协议 Linux
在Linux中,如何配置DNS服务器?
在Linux中,如何配置DNS服务器?
|
19天前
|
开发者 测试技术 Android开发
Xamarin 开发者的五大常见问题及解决方案:从环境搭建到性能优化,全面解析高效跨平台应用开发的技巧与代码实例
【8月更文挑战第31天】Xamarin 开发者常遇问题及解决方案覆盖环境搭建至应用发布全流程,助新手克服技术难关。首先需正确安装配置 Visual Studio 及 Xamarin 支持,设置 iOS/Android 测试环境。利用 Xamarin.Forms 和 XAML 实现高效跨平台开发,共享 UI 和业务逻辑代码。针对性能优化,采取减少 UI 更新、缓存计算结果等措施,复杂问题则借助 Xamarin Profiler 分析。
30 0
|
20天前
|
数据采集 弹性计算 供应链
阿里云服务器付费模式:按量付费、包年包月和抢占式实例全解析
阿里云服务器提供包年包月、按量付费与抢占式实例三种付费模式。包年包月为预付费,适合长期稳定使用,价格更优惠并支持备案。按量付费则为后付费模式,按小时结算,适合短期或访问量波动大的场景,但不支持备案。抢占式实例基于按量付费,价格更低(最多节省90%),适用于无状态应用,如临时测试或可弹性伸缩的Web服务,但存在被系统释放的风险,同样不支持备案。根据具体需求选择合适的付费模式能够有效降低成本并提高效率。
39 0
|
26天前
|
Linux 网络安全 API
【Azure 应用服务】App Service For Linux 环境中,如何从App Service中获取GitHub私有库(Private Repos)的Deploy Key(RSA key)呢?
【Azure 应用服务】App Service For Linux 环境中,如何从App Service中获取GitHub私有库(Private Repos)的Deploy Key(RSA key)呢?
|
26天前
|
存储 Linux 网络安全
【Azure 应用服务】App Service For Linux 如何在 Web 应用实例上住抓取网络日志
【Azure 应用服务】App Service For Linux 如何在 Web 应用实例上住抓取网络日志
|
27天前
|
网络协议 Linux
在Linux中,如何改IP、主机名、DNS?
在Linux中,如何改IP、主机名、DNS?