/
gerrero
/
tcp_chat
Обзор
Документация
Войти
/
gerrero
/
tcp_chat
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/client/tcp_client.cpp
125 строк
4 KB
gerrero
create: client, server, protocol.h, data_provider.h, data_test.cpp, data_test.h, device_connect.cpp, device_connect.h, tcp_client.cpp, tcp_client.h, tcp_server.cpp, tcp_server.h, Makefile, README.md
04 май 2026, 11:19
Верифицирован
04 май 2026, 11:19
98096c3
Код
Авторство
О чём код?
#include "tcp_client.h" #include "../../include/common/protocol.h" // Поставщики данных #include "data_test.h" #include "device_connect.h" #include <iostream> #include <cstring> #include <unistd.h> #include <arpa/inet.h> TcpClient::TcpClient() : sock(-1), provider(nullptr) {} TcpClient::~TcpClient() { cleanup(); } bool TcpClient::createSocket() { sock = socket(AF_INET, SOCK_STREAM, 0); if (sock < 0) { std::cerr << "Ошибка создания сокета\n"; return false; } return true; } bool TcpClient::connectToServer(const std::string& ip, int port) { if (!createSocket()) return false; struct sockaddr_in serv_addr{}; serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(port); if (inet_pton(AF_INET, ip.c_str(), &serv_addr.sin_addr) <= 0) { std::cerr << "Неверный адрес\n"; return false; } if (connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) < 0) { std::cerr << "Ошибка подключения к серверу\n"; return false; } std::cout << "Подключено к серверу сравнения\n"; return true; } bool TcpClient::sendPacket(const void* buf, size_t len) { return sendAll(sock, buf, len); } bool TcpClient::recvPacket(void* buf, size_t len) { return recvAll(sock, buf, len); } void TcpClient::cleanup() { if (sock != -1) { close(sock); sock = -1; } } void TcpClient::selectDataProvider() { // Пробуем подключиться к устройству auto device = std::make_unique<DeviceConnect>("127.0.0.1", DEVICE_PORT); if (device->connect()) { provider = std::move(device); std::cout << "Используется реальное устройство\n"; return; } // Устройство недоступно — используем тестовый генератор std::cout << "Устройство не найдено, переключаюсь на тестовый генератор\n"; provider = std::make_unique<TestData>(); } void TcpClient::run() { // Выбираем источник данных selectDataProvider(); if (!provider) { std::cerr << "Нет источника данных\n"; return; } // Получаем эталонный пакет Packet reference; if (!provider->getReferencePacket(reference.raw, PACKET_SIZE)) { std::cerr << "Ошибка получения эталонного пакета\n"; return; } std::cout << "Эталонный пакет: " << packetToHex(reference) << "\n"; // Отправляем эталонный пакет на сервер сравнения std::cout << "Отправка эталонного пакета на сервер...\n"; if (!sendPacket(reference.raw, PACKET_SIZE)) return; // Получаем эхо (сервер возвращает то же самое) Packet echo; if (!recvPacket(echo.raw, PACKET_SIZE)) return; std::cout << "Эхо получено: " << packetToHex(echo) << "\n"; // Получаем модифицированный пакет (от устройства или тестового генератора) Packet modified; if (!provider->getModifiedPacket(modified.raw, PACKET_SIZE)) { std::cerr << "Ошибка получения модифицированного пакета\n"; return; } std::cout << "Модифицированный пакет (от " << provider->getName() << "): " << packetToHex(modified) << "\n"; // Отправляем модифицированный пакет на сервер для сравнения std::cout << "Отправка модифицированного пакета на сервер...\n"; if (!sendPacket(modified.raw, PACKET_SIZE)) return; // Получаем результат сравнения char buffer[4096] = {0}; ssize_t bytes_read = recv(sock, buffer, sizeof(buffer) - 1, 0); if (bytes_read > 0) { buffer[bytes_read] = '\0'; std::cout << "Результат сравнения от сервера:\n" << buffer << "\n"; } } int main() { TcpClient client; if (!client.connectToServer("127.0.0.1", PORT)) return 1; client.run(); return 0; }