【转】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文档的搜索. 所 ...
随机推荐
- 门户网站架构Nginx+Apache+MySQL+PHP+Memcached+Squid
服务器的大用户量的承载方案 一.前言二.编译安装三. 安装MySQL.memcache四. 安装Apache.PHP.eAccelerator.php-memcache五. 安装Squid六.后记 一 ...
- [Papers]NSE, $\pi$, Lorentz space [Suzuki, JMFM, 2012]
$$\bex \sen{\pi}_{L^{s,\infty}(0,T;L^{q,\infty}(\bbR^3))} \leq \ve_*, \eex$$ with $$\bex \frac{2}{s} ...
- Android入门:用HttpClient模拟HTTP的GET和POST请求
一.HttpClient介绍 HttpClient是用来模拟HTTP请求的,其实实质就是把HTTP请求模拟后发给Web服务器: Android已经集成了HttpClient,因此可以直接使用: ...
- TestNG官方文档中文版(2)-annotation(转)
1. 介绍 TestNG是一个设计用来简化广泛的测试需求的测试框架,从单元测试(隔离测试一个类)到集成测试(测试由有多个类多个包甚至多个外部框架组成的整个系统,例如运用服务器). 编写一个测试的 ...
- SeleniumIDE与eclipse如何连接使用
[秦菲]SeleniumIDE与eclipse如何连接使用 1. 打开Firefox,利用IDE录制脚本(依次点击浏览器界面:工具->Selenium IDE)2. 把录制好的脚本转换成其他语言 ...
- sql联接那点儿事儿
1.交叉联接(cross join) select * from t.toy ,b.boy from toy as t cross join boy as b 其效果同select * from t. ...
- Top 5 Free Screen Recording Softwares For Windows
[转]Top 5 Free Screen Recording Softwares For Windows 该文章是转过来的,因为这里介绍了好几款免费的录制视频的软件.我自己需要使用,也许大家也有需求. ...
- JavaScript相关图书推荐
JavaScript语言精粹(修订版) 作 者 Douglas Crockford(道格拉斯·克罗克福德) 著:赵泽欣 等 译 出 版 社 电子工业出版社 出版时间 2012-09-01 版 ...
- ctags支持的语言
http://ctags.sourceforge.net/languages.html Languages Supported by Exuberant Ctags: Ant Assembler AS ...
- 【Hadoop学习】Super用户以其他用户的名义执行操作
Hadoop版本:2.6.0 本文系从官方文档翻译而来,转载请尊重译者的工作,注明以下链接: http://www.cnblogs.com/zhangningbo/p/4146410.html 简介 ...