【转】adns解析库——域名解析实例(C++、linux)
转自:http://blog.csdn.net/fty8788/article/details/7480334
adns是一个开源的dns解析库
官方文档:http://www.chiark.greenend.org.uk/~ian/adns/
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)
可从此处下载:https://github.com/sunada/adns_example/tree/71c9bf8555b67199c6b94c83027fb71eaa0c0241
#include "adns.h"
#include <sys/errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h> 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");
}
}
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); }
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
【转】adns解析库——域名解析实例(C++、linux)的更多相关文章
- 【转】python3解析库lxml
转自:http://www.cnblogs.com/zhangxinqi/p/9210211.html 阅读目录 1.python库lxml的安装 2.XPath常用规则 (1)读取文本解析节点 (2 ...
- python3解析库lxml
阅读目录 1.python库lxml的安装 2.XPath常用规则 (1)读取文本解析节点 (2)读取HTML文件进行解析 (3)获取所有节点 (4)获取子节点 (5)获取父节点 (6)属性匹配 (7 ...
- python应用之爬虫实战2 请求库与解析库
知识内容: 1.requests库 2.selenium库 3.BeautifulSoup4库 4.re正则解析库 5.lxml库 参考: http://www.cnblogs.com/wupeiqi ...
- Pugixml一种快速解析XML文件的开源解析库
Pugixml是一个轻量级的C++ XML开源解析库,DOM形式的解析器.接口和丰富的遍历和修改操作,快速的解析,此外支持XPath1.0实现数据查询,支持unicode编码: 使用Pugixml可通 ...
- Tomjson - 一个"短小精悍"的 json 解析库
Tomjson,一个"短小精悍"的 json 解析库,tomjson使用Java语言编写,主要作用是把Java对象(JavaBean)序列化为json格式字符串,将json格式字符 ...
- Tomjson - json 解析库
Tomjson - 一个"短小精悍"的 json 解析库 Tomjson,一个"短小精悍"的 json 解析库,tomjson使用Java语言编写,主要作用是把 ...
- pyquery 的用法 --爬虫解析库
如果你对Web有所涉及,如果你比较喜欢用CSS选择器,如果你对jQuery有所了解,那么这里有一个更适合你的解析库--pyquery. 接下来,我们就来感受一下pyquery的强大之处. 1. 准备工 ...
- .NET Core中的CSV解析库
感谢 本篇首先特别感谢从此启程兄的<.NetCore外国一些高质量博客分享>, 发现很多国外的.NET Core技术博客资源, 我会不定期从中选择一些有意思的文章翻译总结一下. .NET ...
- Python 爬虫 解析库的使用 --- XPath
一.使用XPath XPath ,全称XML Path Language,即XML路径语言,它是一门在XML文档中查找信息的语言.它最初是用来搜寻XML文档的,但是它同样适用于HTML文档的搜索. 所 ...
随机推荐
- Linux Shell编程(1): 条件语句
1.if—then#!/bin/bashif date 如果命令运行成功(退出码为0),则then部分的命令被执行then echo "good"fi ...
- 流媒體】jrtplib—VS2010下RTP开源协议库JRTPLIB3.9.1编译
一.JRTPLIB简介 老外用C++编写的开源RTP协议库,用来进行实时数据传输,可以运行在 Windows.Linux. FreeBSD.Solaris.Unix和VxWorks 等多种操作系统上, ...
- HTML5 随音乐节奏变化的频谱图动画
这里将要介绍的HTML5 音频处理接口与Audio标签是不一样的.页面上的Audio标签只是HTML5更语义化的一个表现,而HTML5提供给JavaScript编程用的Audio API则让我们有能力 ...
- css3制作优惠券
<div class="demo-container demo"><style> .demo{width:410px;} .stamp *{padding: ...
- android中sqlite3常用命令
1)打开数据库 在adb shell模式下执行命令sqlite3 + 数据库名称,例如打开email中的EmailProvider.db数据库: 2)sqlite3特殊命令 大多数候,sqlite3读 ...
- iOS已发布应用中对异常信息捕获和处理
iOS已发布应用中对异常信息捕获和处理 iOS开发中我们会遇到程序抛出异常退出的情况,如果是在调试的过程中,异常的信息是一目了然,但是如果是在已经发布的程序中,获取异常的信息有时候是比较困难的. iO ...
- [BILL WEI] stimulsoft 分组页眉页脚的使用
我们在通过stimulsoft设计报表的时候,有的时候,需要做出如下图报表样式 这个时候,因为箱号是分开扩展的,我们就需要用到分组页眉了,如下图demo跟实例所示:
- C++第一章概述
1:C++主要是对于C的继承性做的相当的出色,主要扩充在于程序员可以自己定义自己的数据结构,用数据结构去描述日常生活中的事务,而不是C语言中当当仅有的Struct数据类型等等 2: 每一种语言都有自己 ...
- 恒天云技术分享系列5 – 虚拟化平台性能对比(KVM & VMware)
恒天云技术分享系列:http://www.hengtianyun.com/download-show-id-14.html 概述 本性能测试报告将详细陈述各虚拟化平台基准性能测试的主要结论和详细结果. ...
- 时间都去哪了?——安卓GTD工具
GTD是英文Getting Things Done的缩写,是一种行为管理的方法,也是David Allen写的一本书的书名. GTD的主要原则在于一个人需要通过记录的方式把头脑中的各种任务移出来.通过 ...