2

私はいくつかの 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
4

1 に答える 1

3

ほとんどのコードに従って、この方法で 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
于 2013-09-12T21:06:51.373 に答える