У меня есть следующий код, который проверяет тип запроса в ответе DNS, а затем распечатывает его соответствующим образом.Мне нужен способ разбора CNAME и NS с использованием указанных параметров, но я не могу этого сделать.Здесь tmp
- это переменная, определенная как tmp = (u_char *)(dpkt->payload + 12);
, а dns_label_to_str
- это функция для преобразования DNS-имени в строковый формат, определенный как: *dns_label_to_str(u_char **label, u_char *dest,size_t dest_size,const u_char *payload,const u_char *end)
Код:
switch (qtype) {
case 1: /* A */
data = inet_ntop(AF_INET, tmp, dbuf, BUFSIZ);
break;
case 2: /* NS */
case 5: /* CNAME */
case 12: /* PTR */
data = (char *)dns_label_to_str(
&tmp, (u_char *)dbuf, BUFSIZ,
dpkt->payload, tmp + len
);
break;
case 10: /* NULL */
data = "NULL";
break;
case 15: /* MX (16-bit priority / label) */
i = snprintf(dbuf, 7, "%u ", ntohs(*(uint16_t *)tmp));
tmp += 2;
data = (char *)dns_label_to_str(
&tmp, (u_char *)(dbuf + i), BUFSIZ - i,
dpkt->payload, tmp + len - 2
);
data = dbuf;
break;
case 16: /* TXT (1 byte text length / text) */
if (*tmp <= len && tmp + len < end) {
memcpy(dbuf, tmp+1, *tmp);
dbuf[*tmp+1] = '\0';
} else *dbuf = '\0';
data = dbuf;
break;
case 17: /* AAAA */
data = inet_ntop(AF_INET6, tmp, dbuf, BUFSIZ);
break;
default:
/* Ignore unhandled RR types */
*dbuf = '\0';
data = dbuf;
}
/* Print the output. */
printf("%ld %-5s %-30s %s\n", hdr->ts.tv_sec,
dns_types[qtype], label, data);
ret:
return 0;
}
Если бы кто-нибудь мог помочь с тем, как я могу получить CNAME, когда qtype == 5
будет полезным.Спасибо заранее.