nekitmilk_my_dns #11

Merged
serafim merged 6 commits from nekitmilk_my_dns into dev 2025-04-03 17:40:48 +03:00
1 changed files with 71 additions and 0 deletions
Showing only changes of commit fc975273e2 - Show all commits

View File

@ -9,6 +9,8 @@
#include <net/if.h> // Определение констант сетевых интерфейсов (IFNAMSIZ) #include <net/if.h> // Определение констант сетевых интерфейсов (IFNAMSIZ)
#include <sys/ioctl.h> // Управление сокетами и интерфейсами (ioctl) #include <sys/ioctl.h> // Управление сокетами и интерфейсами (ioctl)
#include <fcntl.h> // Флаги файловых дескрипторов (fcntl) #include <fcntl.h> // Флаги файловых дескрипторов (fcntl)
#include <curl/curl.h>
serafim marked this conversation as resolved Outdated

Добавить коменты к либам

Добавить коменты к либам
#include <nlohmann/json.hpp>
// ====== DCL глобальные переменные ====== // // ====== DCL глобальные переменные ====== //
@ -404,13 +406,82 @@ void my_fin()
std::exit(status); std::exit(status);
} }
using json = nlohmann::json;
serafim marked this conversation as resolved Outdated

Давай без этого и просто на местах использования контекст резолвить

Давай без этого и просто на местах использования контекст резолвить
// curl --http2 "https://dns.google/resolve?name=example.com&type=A"
// curl --http2 --header "accept: application/dns-json" "https://1.1.1.1/dns-query?name=cloudflare.com" --next --http2 --header "accept: application/dns-json" "https://1.1.1.1/dns-query?name=yandex.com"
void my_dns() void my_dns()
{ {
// Данная процедура сопостовляет доменное имя с IP // Данная процедура сопостовляет доменное имя с IP
// Обрабатываем перменнкю domain, записываем в ip
// -4001 - ошибка инициализации CURL
// -4002 - ошибка запроса CURL
// -4003 - ошибка парсинга JSON
status = 0;
serafim marked this conversation as resolved Outdated

Нужно сделать две секции

// === Объявления ===
int a;
int b;

// === Инициализация ===
a = 0;
b = ;

И в них поместить все переменные из процедуры

Нужно сделать две секции ``` // === Объявления === int a; int b; // === Инициализация === a = 0; b = ; ``` И в них поместить все переменные из процедуры
CURL* curl = 0; // объект curl
CURLcode res = {}; // результат выполнения запроса
std::string response; // ответ DNS сервера
std::string url = ""; // API DNS сервера
struct curl_slist* headers = {0}; // Заголовки
printf("start my_dns"); // debug printf("start my_dns"); // debug
// Инициализируем curl
curl = curl_easy_init();
if (!curl) {
status = -4001;

return наверное нужен

return наверное нужен
}
// Формируем URL для Cloudflare DoH
url = "https://1.1.1.1/dns-query?name=" + domain + "&type=A";
// Настройки CURL
curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);
curl_easy_setopt(curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0); // HTTP/2
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 1L); // Проверка SSL
// Устанавливаем заголовок
headers = curl_slist_append(headers, "accept: application/dns-json");

Можно в инициализацию двинуть

Можно в инициализацию двинуть
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
// Выполняем запрос
res = curl_easy_perform(curl);
if (res != CURLE_OK) {
status = -4002;

return

return
} else {
// Парсим JSON и извлекаем IP
try {
auto json_data = json::parse(response);

auto ни-ни
эту переменную тоже объявить в соответствующей секции

auto ни-ни эту переменную тоже объявить в соответствующей секции
if (json_data.contains("Answer")) {
for (const auto& record : json_data["Answer"]) {
if (record["type"] == 1) { // A-запись (IPv4)
ip = record["data"].get<std::string>();

Наверное перед концом функции нужна проверка того, что всё это распарсилось и в ip есть валидный ip

Наверное перед концом функции нужна проверка того, что всё это распарсилось и в ip есть валидный ip
break;
}
}
}
} catch (const std::exception& e) {
status = -4003;

return?

return?
}
}

Если всё ок, поставь статус, который по схеме и main нужен, чтобы продолжать работать

Если всё ок, поставь статус, который по схеме и main нужен, чтобы продолжать работать
// Освобождаем ресурсы
curl_slist_free_all(headers);
curl_easy_cleanup(curl);
printf("end my_dns"); // debug printf("end my_dns"); // debug
} }
// Callback для записи ответа от сервера
size_t WriteCallback(void* contents, size_t size, size_t nmemb, std::string* output) {

А её нельзя определить внутри процедуры?

А её нельзя определить внутри процедуры?
size_t total_size = size * nmemb;
output->append((char*)contents, total_size);
return total_size;
}
void my_tcp_syn() void my_tcp_syn()
{ {
// Данная процедура выполняет TCP SYN Flood атаку // Данная процедура выполняет TCP SYN Flood атаку