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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值