DNS: получение IP-адреса хоста с помощью resolv.h

Я пытаюсь понять запросы DNS, используя resolv.h библиотека в BIND. Я пытаюсь разобрать IP-адрес с RR, возвращенных ns_parserr(), Я могу успешно проанализировать авторитетный NS, используя код, предоставленный https://docstore.mik.ua/orelly/networking_2ndEd/dns/ch15_02.htm, но я не могу получить 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 библиотека в интернете, кроме цитируемого источника. Спасибо всем за поддержку, я ценю это.

1 ответ

Решение

Вы должны проанализировать данные записи ресурса в ns_rr сам; формат описан в rfc1035 (см. здесь, формат A rdata находится в разделе 3.4.1)

В вашем [WHAT TO DO HERE?]Вы можете, например, проанализировать данные и напечатать 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));

Если вы хотите поддерживать другие типы записей ресурсов, вам необходимо ознакомиться с их конкретным форматом.

Другие вопросы по тегам