/
gerrero
/
RequestsAnalyzator
Обзор
Документация
Войти
/
gerrero
/
RequestsAnalyzator
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
tests/test_simulators.cpp
150 строк
6 KB
Кирилл Матвеев
create: config.yaml, protocol.h, stend.h, tcp_client.cpp, analyzer.cpp, tcp_client.h, ssr_service.h, stend.cpp, analyzer.h, main.cpp, ssr_service.cpp, test_simulators.cpp, CMakeLists.txt, README.md
28 май 2026, 11:41
Верифицирован
28 май 2026, 11:41
9b02f48
Код
Авторство
О чём код?
#include <boost/asio.hpp> #include <iostream> #include <thread> #include <cstring> #include <cstdint> #include <atomic> #include <mutex> #include <random> const int PACKET_SIZE = 32; const int PACKETS_PER_ROUND = 10; // количество пакетов в круге (id от 0 до 9) std::atomic<bool> running{true}; std::mutex printMutex; void safePrint(const std::string& msg) { std::lock_guard<std::mutex> lock(printMutex); std::cout << msg << std::endl; } void waitForStop() { safePrint("Нажмите Enter для завершения..."); std::cin.get(); running = false; } struct Packet { uint8_t raw[PACKET_SIZE]; Packet() { memset(raw, 0, PACKET_SIZE); } }; void runSimulator(boost::asio::io_context& io, uint16_t port, const std::string& name) { try { auto acc = std::make_shared<boost::asio::ip::tcp::acceptor>( io, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), port)); safePrint("[" + name + "-сервер] Запущен на порту " + std::to_string(port)); // Генератор случайных чисел std::random_device rd; std::mt19937 gen(rd()); std::uniform_int_distribution<> byteDis(0, 255); std::uniform_int_distribution<> ampDis(0, 65535); while (running) { auto sock = std::make_shared<boost::asio::ip::tcp::socket>(io); acc->accept(*sock); safePrint("[" + name + "-сервер] Клиент подключился"); int roundNumber = 1; while (running) { for (uint32_t id = 0; id < PACKETS_PER_ROUND && running; ++id) { // SSR: пропускаем id=3 и id=7 в каждом чётном круге if (name == "SSR" && (id == 3 || id == 7) && roundNumber % 2 == 0) { continue; } // Stend: пропускаем id=5 в каждом третьем круге if (name == "Stend" && id == 5 && roundNumber % 3 == 0) { continue; } Packet pkt; memset(pkt.raw, 0, PACKET_SIZE); // Случайные данные pkt.raw[0] = byteDis(gen); // attenuation_code (байт 0) pkt.raw[1] = byteDis(gen); // attenuation_code (байт 1) pkt.raw[2] = byteDis(gen); // attenuation_code (байт 2) pkt.raw[3] = byteDis(gen); // attenuation_code (байт 3) uint16_t amplitude = ampDis(gen); pkt.raw[4] = (amplitude >> 8) & 0xFF; // amplitude pkt.raw[5] = amplitude & 0xFF; uint16_t s1_amplitude = ampDis(gen); pkt.raw[6] = (s1_amplitude >> 8) & 0xFF; // s1_amplitude pkt.raw[7] = s1_amplitude & 0xFF; // content (байты 8-21) for (int i = 8; i <= 21; i++) { pkt.raw[i] = byteDis(gen); } // type, is_test_target, start_distance (байт 22) pkt.raw[22] = byteDis(gen); // antena_id, has_next (байт 23) pkt.raw[23] = byteDis(gen); // time_to_next (байты 24-27) pkt.raw[24] = byteDis(gen); pkt.raw[25] = byteDis(gen); pkt.raw[26] = byteDis(gen); pkt.raw[27] = byteDis(gen); // id (байты 28-31) pkt.raw[28] = (id >> 24) & 0xFF; pkt.raw[29] = (id >> 16) & 0xFF; pkt.raw[30] = (id >> 8) & 0xFF; pkt.raw[31] = id & 0xFF; // Stend: искажаем id=4 и id=8 в каждом третьем круге if (name == "Stend" && (id == 4 || id == 8) && roundNumber % 3 == 0) { pkt.raw[0] ^= 0xFF; // инвертируем первый байт } boost::system::error_code ec; boost::asio::write(*sock, boost::asio::buffer(pkt.raw, PACKET_SIZE), ec); if (ec) goto disconnect; // Задержка std::this_thread::sleep_for(std::chrono::milliseconds(100)); } roundNumber++; } disconnect: safePrint("[" + name + "-сервер] Клиент отключился"); boost::system::error_code ec; sock->close(ec); } safePrint("[" + name + "-сервер] Остановлен"); } catch (std::exception& e) { safePrint("[" + name + "-сервер] Ошибка: " + e.what()); } } int main() { boost::asio::io_context io; std::cout << "=== Тестовые серверы (" << PACKETS_PER_ROUND << " пакетов в круге) ===" << std::endl; std::cout << "SSR -> 127.0.0.1:8081" << std::endl; std::cout << "Stend -> 127.0.0.1:8082" << std::endl; std::cout << std::endl; std::thread stopThread(waitForStop); std::thread ssrThread([&io]() { runSimulator(io, 8081, "SSR"); }); std::thread stendThread([&io]() { runSimulator(io, 8082, "Stend"); }); io.run(); ssrThread.join(); stendThread.join(); stopThread.join(); std::cout << "=== Остановлены ===" << std::endl; return 0; }