C/C++ Почему возвращается неверный тип DNS записи?
Я писал код получения различных dns записей с сервера, таких как TXT и NS, а не только A, но столкнулся с проблемой, что я указываю тип TXT(или любой другой), но почему-то всегда получаю NS сервер домена.
// Уже установлено UDP подключение к 1.1.1.1:53
char buf[128];
memset(buf, 0, 128);
// Стандартные заполнения полей таких как количество вопросов
buf[0] = 0x12; // Transaction ID
buf[2] = 0x01; // Recursion Desired
buf[5] = 0x01; // 1 question
// Доменное имя в формате QName, www.example.com -> 3www7example3com0
int nameLen = strlen(domain);
char domainCpy[nameLen+1];
int lblLen = 0;
for (int nameLenCpy = nameLen; nameLenCpy != 0; nameLenCpy--) {
if (nameLenCpy == 1) {domainCpy[nameLenCpy-1] = 0x00 + lblLen; break;}
if (*(domain+nameLenCpy-1) == '.') {
domainCpy[nameLenCpy-1] = 0x00 + lblLen;
lblLen = 0;
continue;
}
domainCpy[nameLenCpy-1] = domain[nameLenCpy-1];
lblLen++;
}
// копирование QName в буффер
strcpy(buf+12, domainCpy);
int pos = nameLen + 12;
buf[pos] = 0x00; // end of string
// остаточные поля такие как тип запроса
buf[pos+1] = 0x00; // 1 byte TYPE
buf[pos+2] = 0x10; // 2 byte TYPE
buf[pos+3] = 0x00; // CLASS 1 byte
buf[pos+4] = 0x01; // CLASS 2 byte - IN
send_net(conn, buf, pos+5); // отправка запроса
и я получаю всегда независимо от типа запроса и домена zone.ns.cloudflare.com
(и подобные NS сервера), в чём проблема?
// Чтение запроса. Вроде тут проблем быть не должно
memset(buf, 0, 128);
recv_net(conn, buf, 128);
uint16_t answer_start = 12 + strlen(buf+12) + 5 + 12; // пропуск заголовка
uint16_t labelLen = 0;
int32_t p = -1;
while (1) {
labelLen = buf[answer_start];
if (labelLen == 0) {break;}
answer_start++;
p++;
for (int i = 0; i<labelLen; i++) {
*(output+p) = buf[answer_start+i]; // запись в буффер результата
p++;
}
answer_start = answer_start + labelLen;
if (buf[answer_start] != 0) {*(output+p) = '.';} // замена QName формата на обычный
}