DNS:使用 resolv.h 检索主机 IP 地址

DNS: retrieving host IP address using resolv.h

我正在尝试使用 BIND 中的 resolv.h 库来理解 DNS 查询。 我正在努力尝试从 ns_parserr() 返回的 RR 中解析 IP 地址。 我可以使用 https://docstore.mik.ua/orelly/networking_2ndEd/dns/ch15_02.htm 提供的代码成功解析权威 NS,但我似乎无法获取 A 类型的记录并 打印它们 。 主要是因为我不知道 IP 地址在 ns_rr 结构中是如何编码的。查看实现,RDATA 是 const u_char * 类型。 如何从该记录中获取 IP?

int main (int argc, char * argv[])
{
     union {
        HEADER hdr;              
        u_char buf[NS_PACKETSZ]; 
    } response;                  
    int responseLen;             
    res_init();
    ns_msg handle;
    responseLen =res_query(argv[1],ns_c_in,ns_t_a,(u_char *)&response,sizeof(response));
    if (responseLen<0)
        exit(-1);
    if (ns_initparse(response.buf, responseLen, &handle)<0)
    {
        fprintf(stderr, "ERROR PARSING RESPONSE....");
        perror("damn");
        exit(-1);

    }
    ns_rr rr;
    int rrnum;
    ns_sect section=ns_s_an;
    for (rrnum=0;rrnum<(ns_msg_count(handle,section));rrnum++)
    {
        if (ns_parserr(&handle,ns_s_an,rrnum,&rr)<0)
        {
            fprintf(stderr, "ERROR PARSING RRs");
            exit(-1);
        }   

        if (ns_rr_type(rr)==ns_t_a)
        {
            [WHAT TO DO HERE?]
        }
    }
    return 0;   
}

我通常会尝试自己解决这些问题,但是除了引用的来源外,互联网上关于 resolv.h 库的信息并不多。 谢谢大家的支持,我很感激。

需要自己解析ns_rr中的资源记录数据;该格式在 rfc1035 中描述(参见 here,A rdata 格式在第 3.4.1 节)

在您的 [WHAT TO DO HERE?] 中,您可以像这样解析 A rdata 并打印 IP:

struct in_addr in;
memcpy(&in.s_addr, ns_rr_rdata(rr), sizeof(in.s_addr));
fprintf(stderr, "%s IN A %s\n", ns_rr_name(rr), inet_ntoa(in));

如果您想支持其他资源记录类型,您必须熟悉它们的特定格式。