adns解析库——域名解析实例(C++、linux)

来源:互联网 发布:北京域名备案需要多久 编辑:程序博客网 时间:2024/06/06 14:00

转自: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.oevent.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 
原创粉丝点击