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));
Если вы хотите поддерживать другие типы записей ресурсов, вам необходимо ознакомиться с их конкретным форматом.