转自: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)的更多相关文章

  1. 【转】python3解析库lxml

    转自:http://www.cnblogs.com/zhangxinqi/p/9210211.html 阅读目录 1.python库lxml的安装 2.XPath常用规则 (1)读取文本解析节点 (2 ...

  2. python3解析库lxml

    阅读目录 1.python库lxml的安装 2.XPath常用规则 (1)读取文本解析节点 (2)读取HTML文件进行解析 (3)获取所有节点 (4)获取子节点 (5)获取父节点 (6)属性匹配 (7 ...

  3. python应用之爬虫实战2 请求库与解析库

    知识内容: 1.requests库 2.selenium库 3.BeautifulSoup4库 4.re正则解析库 5.lxml库 参考: http://www.cnblogs.com/wupeiqi ...

  4. Pugixml一种快速解析XML文件的开源解析库

    Pugixml是一个轻量级的C++ XML开源解析库,DOM形式的解析器.接口和丰富的遍历和修改操作,快速的解析,此外支持XPath1.0实现数据查询,支持unicode编码: 使用Pugixml可通 ...

  5. Tomjson - 一个"短小精悍"的 json 解析库

    Tomjson,一个"短小精悍"的 json 解析库,tomjson使用Java语言编写,主要作用是把Java对象(JavaBean)序列化为json格式字符串,将json格式字符 ...

  6. Tomjson - json 解析库

    Tomjson - 一个"短小精悍"的 json 解析库 Tomjson,一个"短小精悍"的 json 解析库,tomjson使用Java语言编写,主要作用是把 ...

  7. pyquery 的用法 --爬虫解析库

    如果你对Web有所涉及,如果你比较喜欢用CSS选择器,如果你对jQuery有所了解,那么这里有一个更适合你的解析库--pyquery. 接下来,我们就来感受一下pyquery的强大之处. 1. 准备工 ...

  8. .NET Core中的CSV解析库

    感谢 本篇首先特别感谢从此启程兄的<.NetCore外国一些高质量博客分享>, 发现很多国外的.NET Core技术博客资源, 我会不定期从中选择一些有意思的文章翻译总结一下. .NET ...

  9. Python 爬虫 解析库的使用 --- XPath

    一.使用XPath XPath ,全称XML Path Language,即XML路径语言,它是一门在XML文档中查找信息的语言.它最初是用来搜寻XML文档的,但是它同样适用于HTML文档的搜索. 所 ...

随机推荐

  1. 庖丁解牛-----Live555源码彻底解密(RTP解包)

    Live555 客户端解包 以testRTSPClient.cpp为例讲解: Medium<-MediaSource<-FramedSource<-RTPSource<-Mul ...

  2. 最简单的视音频播放示例5:OpenGL播放RGB/YUV

    本文记录OpenGL播放视频的技术.OpenGL是一个和Direct3D同一层面的技术.相比于Direct3D,OpenGL具有跨平台的优势.尽管在游戏领域,DirectX的影响力已渐渐超越OpenG ...

  3. solr4.5配置中文分词器mmseg4j

    solr4.x虽然提供了分词器,但不太适合对中文的分词,给大家推荐一个中文分词器mmseg4j mmseg4j的下载地址:https://code.google.com/p/mmseg4j/ 通过以下 ...

  4. XTUOJ 1252 Defense Tower 贪心

    题目链接:http://202.197.224.59/OnlineJudge2/index.php/Problem/read/id/1252 思路:考虑每条边对玩家的伤害 假设连接的节点是u,v,破坏 ...

  5. HTML 表单提交 的简单代码

    <form action="check.php" method="post"> 用户名:<input type="text" ...

  6. 新版本ubuntu13.10软件安装

    问题1:如何解决ubunt13.04不能和主机共享文件的问题 . 安装VMware Tools 网上有很多的资料,这里没有给出. . 设置共享文件夹目录 ) 在VMware虚拟机窗口,选择VM-> ...

  7. 学习笔记之Linux内核编译过程

    准备工作 物理主机:win8(32位) 虚拟机工具:VirtualBox_4.3.16_Win32 虚拟主机:xubuntu-12.04.4 安装virtualBox功能增强包 设置好虚拟机与主机的共 ...

  8. linux vim用法总结

    1.跳转到指定行 编辑模式下:输入  ngg或nG(n代表行数) 命令模式下:输入  :n(n代表行数) 2.查找命令 命令模式下输入 / 后面加上查找的内容 例如    :/name     (查找 ...

  9. caldera

    Caldera International星期一宣布将公司名称变更为SCO Group,交易代码则改为SCOX,希望SCO可以在客户群当中建立更好的品牌认同. Caldera除了有自己的Linux版本 ...

  10. 第二百八十天 how can I 坚持

    今天发现一只大bug,目前还没有解决掉... 晚上和徐斌还有他同学一块吃了个饭.还有.没了. 今天想早睡觉. 今天股市暴跌,二度熔断,好精彩,哈哈,不说啥了,还有苹果股票和谷歌市值越来越接近了,要走下 ...