提取DNS A记录的TTL值

时间:2013-09-12 19:19:59

标签: c dns ttl libresolv

我正在做一些dns的东西,我需要为SRV做一个A记录查找并从中提取ttl和ip地址:

我能够使用以下代码提取ip,但是如何提取TTL?

 l = res_query(argv[1], ns_c_any, ns_t_a, nsbuf, sizeof(nsbuf));
    if (l < 0)
    {
      perror(argv[1]);
    }
    ns_initparse(nsbuf, l, &msg);
    l = ns_msg_count(msg, ns_s_an);
    for (i = 0; i < l; i++)
    {
      ns_parserr(&msg, ns_s_an, 0, &rr);
      ns_sprintrr(&msg, &rr, NULL, NULL, dispbuf, sizeof(dispbuf));
      printf("\t%s \n", dispbuf);
      inet_ntop(AF_INET, ns_rr_rdata(rr), debuf, sizeof(debuf));
      printf("\t%s \n", debuf);
    }

输出:

./a.out sip-anycast-1.voice.google.com
        sip-anycast-1.voice.google.com.  21h55m46s IN A  216.239.32.1
        216.239.32.1

1 个答案:

答案 0 :(得分:2)

主要是你的代码,你可以用这种方式检索IP和TTL(我修复了你的ns_parserr()调用,以便它正确地遍历响应中的多个条目):

    l = res_query(argv[1], ns_c_any, ns_t_a, nsbuf, sizeof(nsbuf));
    if (l < 0) {
        perror(argv[1]);
        exit(EXIT_FAILURE);
    }
    ns_initparse(nsbuf, l, &msg);
    c = ns_msg_count(msg, ns_s_an);
    for (i = 0; i < c; ++i) {
        ns_parserr(&msg, ns_s_an, i, &rr);
        ns_sprintrr(&msg, &rr, NULL, NULL, dispbuf, sizeof(dispbuf));
        printf("%s\n", dispbuf);
        if (ns_rr_type(rr) == ns_t_a) {
            uint8_t ip[4];
            uint32_t ttl = ns_rr_ttl(rr);
            memcpy(ip, ns_rr_rdata(rr), sizeof(ip));
            printf("ip: %u.%u.%u.%u\n", ip[0], ip[1], ip[2], ip[3]);
            printf("ttl: %u\n", ttl);
        }
    }

它产生以下输出:

$ ./a.out myserver.mydomain.com
myserver.mydomain.com.  1H IN A         172.16.1.21
ip: 172.16.1.21
ttl: 3600

我无法在libresolv库上找到很多文档,并且共享库libresolv.so似乎不包含链接程序所需的所有符号。所以,我必须像这样编译程序:

$ gcc test_resolv.c -static -lresolv -dynamic