博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【转】adns解析库——域名解析实例(C++、linux)
阅读量:6196 次
发布时间:2019-06-21

本文共 4379 字,大约阅读时间需要 14 分钟。

转自: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 
#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"); } } 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
 
你可能感兴趣的文章
Ta-Lib用法介绍 !
查看>>
关于 android百度地图 调用 地理位置 经纬度坐标,只调用一次的解决方法,通知栏不总是 搜索 GPS 。。。...
查看>>
Apache CXF 框架结构和基本原理
查看>>
程序员开发常用英语词汇
查看>>
Class
查看>>
YARN中内存的设置
查看>>
Django admin 自定制
查看>>
随机ID添加
查看>>
Htmlparser专题
查看>>
1060. 爱丁顿数(25)
查看>>
meizu mx2 android adb driver install
查看>>
序列号
查看>>
第四十一天
查看>>
SQL查询数据时报错
查看>>
eclipse code style template
查看>>
oracle数据库的随堂笔记(四)-定义并使用变量
查看>>
了不起的分支和循环01 - 零基础入门学习Python007
查看>>
进位标志位
查看>>
[2669]2-2 Time类的定义
查看>>
MySQL 支持的数据类型
查看>>