/
gerrero
/
RequestsAnalyzator
Обзор
Документация
Войти
/
gerrero
/
RequestsAnalyzator
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/analyzer.cpp
160 строк
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 "analyzer.h" #include <iostream> #include <algorithm> #include <iomanip> #include <sstream> #include <cstring> Analyzer::Analyzer(const std::string& logPath) : roundNumber(0) { log.open(logPath, std::ios::app); if (!log) std::cerr << "Не удалось открыть лог-файл\n"; } void Analyzer::addSSRPacket(const uint8_t* data, size_t len) { if (len != PACKET_SIZE) return; Packet pkt; memcpy(pkt.raw, data, PACKET_SIZE); if (pkt.isNewRound() && !ssrRound.empty()) { roundNumber++; logLine("\n========== Круг " + std::to_string(roundNumber) + " ==========", true); compareRound(); ssrRound.clear(); stendRound.clear(); } ssrRound[pkt.getId()] = pkt; } void Analyzer::addStendPacket(const uint8_t* data, size_t len) { if (len != PACKET_SIZE) return; Packet pkt; memcpy(pkt.raw, data, PACKET_SIZE); stendRound[pkt.getId()] = pkt; } void Analyzer::onDisconnect() { if (!ssrRound.empty() || !stendRound.empty()) { roundNumber++; logLine("\n========== Круг " + std::to_string(roundNumber) + " (соединение разорвано) ==========", true); compareRound(); ssrRound.clear(); stendRound.clear(); } logLine("\n////////// ПЕРЕПОДКЛЮЧЕНИЕ //////////\n"); } std::string Analyzer::packetToHex(const Packet& pkt) const { std::ostringstream ss; for (int i = 0; i < PACKET_SIZE; i++) { ss << std::hex << std::setw(2) << std::setfill('0') << (int)pkt.raw[i]; if ((i + 1) % 8 == 0 && i != PACKET_SIZE - 1) ss << " "; } return ss.str(); } std::string Analyzer::packetToDetailedString(const Packet& pkt) const { std::ostringstream ss; ss << "ID: " << std::dec << pkt.getId() << ", Type: " << (int)pkt.getType() << ", Amplitude: " << pkt.getAmplitude() << ", Attenuation: " << (int)pkt.getAttenuationCode() << ", HasNext: " << (pkt.hasNext() ? "yes" : "no"); return ss.str(); } std::string Analyzer::formatHexDump(const uint8_t* data, size_t len) const { std::ostringstream ss; ss << std::hex << std::setfill('0'); for (size_t i = 0; i < len; i++) { if (i % 16 == 0) { if (i > 0) ss << "\n"; ss << " " << std::setw(4) << i << ": "; } ss << std::setw(2) << (int)data[i] << " "; } return ss.str(); } std::string Analyzer::diffPackets(const Packet& ssrPkt, const Packet& stendPkt) const { std::ostringstream ss; ss << " Различия по байтам:\n"; ss << " Байт | SSR | Stend\n"; ss << " -----+-----+------\n"; bool hasDifferences = false; for (int i = 0; i < PACKET_SIZE; i++) { if (ssrPkt.raw[i] != stendPkt.raw[i]) { hasDifferences = true; ss << " " << std::dec << std::setw(4) << std::setfill(' ') << i << " | " << std::hex << std::setw(2) << std::setfill('0') << (int)ssrPkt.raw[i] << " | " << std::hex << std::setw(2) << std::setfill('0') << (int)stendPkt.raw[i] << " "; if (i >= 0 && i <= 3) ss << "(attenuation_code)"; else if (i >= 4 && i <= 5) ss << "(amplitude)"; else if (i >= 6 && i <= 7) ss << "(s1_amplitude)"; else if (i >= 8 && i <= 21) ss << "(content[" << (i-8) << "])"; else if (i == 22) ss << "(type/is_test/start_dist)"; else if (i == 23) ss << "(antena_id/has_next)"; else if (i >= 24 && i <= 27) ss << "(time_to_next)"; else if (i >= 28 && i <= 31) ss << "(id)"; ss << "\n"; } } return hasDifferences ? ss.str() : " (не удалось найти различий)\n"; } void Analyzer::compareRound() { logLine("SSR: " + std::to_string(ssrRound.size()) + " пакетов, Stend: " + std::to_string(stendRound.size()) + " пакетов"); int lostCount = 0, extraCount = 0, corruptedCount = 0, matchedCount = 0; for (auto& [id, ssrPkt] : ssrRound) { auto it = stendRound.find(id); if (it != stendRound.end()) { if (memcmp(ssrPkt.raw, it->second.raw, PACKET_SIZE) != 0) { corruptedCount++; logLine("\n [ИСКАЖЁН] Пакет id=" + std::to_string(id), true); logLine(" Параметры пакета:"); logLine(" SSR: " + packetToDetailedString(ssrPkt)); logLine(" Stend: " + packetToDetailedString(it->second)); logLine(diffPackets(ssrPkt, it->second)); } else { matchedCount++; } } else { lostCount++; logLine("\n [ПОТЕРЯН] Пакет id=" + std::to_string(id) + " (отсутствует на стенде)", true); logLine(" Параметры потерянного пакета:"); logLine(" " + packetToDetailedString(ssrPkt)); } } for (auto& [id, stendPkt] : stendRound) { if (ssrRound.find(id) == ssrRound.end()) { extraCount++; logLine("\n [ЛИШНИЙ] Пакет id=" + std::to_string(id) + " (отсутствует на SSR)", true); logLine(" Параметры лишнего пакета:"); logLine(" " + packetToDetailedString(stendPkt)); } } logLine("\n Статистика:", true); logLine(" Пакетов SSR: " + std::to_string(ssrRound.size())); logLine(" Пакетов Stend: " + std::to_string(stendRound.size())); logLine(" Совпало: " + std::to_string(matchedCount)); logLine(" Потеряно: " + std::to_string(lostCount)); logLine(" Лишних: " + std::to_string(extraCount)); logLine(" Искажено: " + std::to_string(corruptedCount)); } void Analyzer::logLine(const std::string& line, bool bold) { if (bold) std::cout << "\033[1m" << line << "\033[0m" << std::endl; else std::cout << line << std::endl; if (log.is_open()) log << line << "\n"; }