加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_汕头站长网 (https://www.0754zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

linux下域名解析函数

发布时间:2022-11-14 11:17:34 所属栏目:Linux 来源:
导读:  adns是一个开源的dns解析库

  官方文档:~ian/adns/

  1. 初始化

  adns_state adns;

  adns_query query;

  adns_answer *answer;

  函数原型:

  int adns_init(ad
  adns是一个开源的dns解析库
 
  官方文档:~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)
 
  可从此处下载:
 
  #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)] = ' ';
 
  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
 
  ", ans->status == adns_s_ok ? inet_ntoa(ans->rrs.addr->addr.inet.sin_addr) : "no");
 
  * else
 
  * printf("ip: %s
 
  ", 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
 
  ", buf);
 
  }
 
  else{
 
  printf("no
 
  ");
 
  }
 
  }
 
  else{
 
  if(ans->status == adns_s_ok){
 
  char buf[INET6_ADDRSTRLEN];
 
  inet_ntop(AF_INET6, ans->rrs.in6addr, buf, sizeof(buf));
 
  printf("ip: %s
 
  ", buf);
 
  }
 
  else{
 
  printf("no
 
  ");
 
  }
 
  }
 
  adns_finish(ads);
 
  break;
 
  }
 
  }
 
  else if (res == ESRCH || res == EAGAIN) {
 
  sleep(1);
 
  } else {
 
  printf("host(%s) is err!
 
  ", 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
 

(编辑:云计算网_汕头站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!