/
gerrero
/
RequestsAnalyzator
Обзор
Документация
Войти
/
gerrero
/
RequestsAnalyzator
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/tcp_client.cpp
92 строки
3 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 "tcp_client.h" #include <iostream> #include <cstring> TcpClient::TcpClient(boost::asio::io_context& io, const std::string& name) : io(io), name(name) { readBuffer.reserve(4096); } TcpClient::~TcpClient() { disconnect(); } void TcpClient::configure(const std::string& ip_, int port_, bool doReconnect_, int reconnectDelaySec_) { ip = ip_; port = port_; doReconnect = doReconnect_; reconnectDelaySec = reconnectDelaySec_; } bool TcpClient::connect(const std::string& ip, int port) { disconnect(); try { sock = std::make_unique<boost::asio::ip::tcp::socket>(io); boost::asio::ip::tcp::resolver r(io); boost::asio::connect(*sock, r.resolve(ip, std::to_string(port))); connected = true; readBuffer.clear(); // очищаем буфер при новом подключении std::cout << "[" << name << "] Подключено " << ip << ":" << port << "\n"; startRead(); return true; } catch (std::exception& e) { std::cerr << "[" << name << "] Ошибка: " << e.what() << "\n"; return false; } } void TcpClient::disconnect() { if (sock) { boost::system::error_code ec; sock->close(ec); sock.reset(); } connected = false; readBuffer.clear(); std::cout << "[" << name << "] Отключено\n"; } bool TcpClient::isConnected() const { return connected; } void TcpClient::setDataCallback(DataCallback cb) { onData = cb; } void TcpClient::send(const uint8_t* data, size_t len) { if (!connected) return; try { boost::asio::write(*sock, boost::asio::buffer(data, len)); } catch (...) { disconnect(); } } void TcpClient::startRead() { if (!sock) return; auto buf = std::make_shared<std::vector<uint8_t>>(4096); sock->async_read_some(boost::asio::buffer(*buf), [this, buf](boost::system::error_code ec, size_t n) { if (!ec && n > 0) { // Добавляем полученные данные в буфер readBuffer.insert(readBuffer.end(), buf->begin(), buf->begin() + n); // Нарезаем на пакеты по 32 байта while (readBuffer.size() >= PACKET_SIZE) { if (onData) { onData(readBuffer.data(), PACKET_SIZE); } readBuffer.erase(readBuffer.begin(), readBuffer.begin() + PACKET_SIZE); } startRead(); // продолжаем чтение } else { std::cerr << "[" << name << "] Соединение разорвано\n"; disconnect(); if (doReconnect) startReconnectTimer(); } }); } void TcpClient::startReconnectTimer() { reconnectTimer = std::make_unique<boost::asio::steady_timer>(io); reconnectTimer->expires_after(std::chrono::seconds(reconnectDelaySec)); reconnectTimer->async_wait([this](boost::system::error_code ec) { if (!ec && !isConnected()) { std::cout << "[" << name << "] Попытка переподключения...\n"; connect(ip, port); } }); }