/
gerrero
/
tcp_chat
Обзор
Документация
Войти
/
gerrero
/
tcp_chat
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/server/tcp_server.cpp
103 строки
3 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_server.h" #include "../../include/common/protocol.h" #include <iostream> #include <cstring> #include <unistd.h> #include <arpa/inet.h> TcpServer::TcpServer() : server_fd(-1), client_socket(-1) {} TcpServer::~TcpServer() { cleanup(); } bool TcpServer::createSocket() { server_fd = socket(AF_INET, SOCK_STREAM, 0); if (server_fd == -1) { std::cerr << "Ошибка создания сокета\n"; return false; } int opt = 1; if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt))) { std::cerr << "Ошибка setsockopt\n"; return false; } return true; } bool TcpServer::bindSocket(int port) { struct sockaddr_in address{}; address.sin_family = AF_INET; address.sin_addr.s_addr = INADDR_ANY; address.sin_port = htons(port); if (bind(server_fd, (struct sockaddr*)&address, sizeof(address)) < 0) { std::cerr << "Ошибка bind\n"; return false; } return true; } bool TcpServer::listenForClient() { if (listen(server_fd, 3) < 0) { std::cerr << "Ошибка listen\n"; return false; } return true; } bool TcpServer::acceptClient() { struct sockaddr_in address{}; socklen_t addrlen = sizeof(address); client_socket = accept(server_fd, (struct sockaddr*)&address, &addrlen); if (client_socket < 0) { std::cerr << "Ошибка accept\n"; return false; } char client_ip[INET_ADDRSTRLEN]; inet_ntop(AF_INET, &address.sin_addr, client_ip, INET_ADDRSTRLEN); std::cout << "Клиент подключился: " << client_ip << ":" << ntohs(address.sin_port) << "\n"; return true; } bool TcpServer::recvPacket(void* buf, size_t len) { return recvAll(client_socket, buf, len); } bool TcpServer::sendPacket(const void* buf, size_t len) { return sendAll(client_socket, buf, len); } void TcpServer::comparePackets(const uint8_t* orig, const uint8_t* ret) { Packet pktOrig, pktRet; memcpy(pktOrig.raw, orig, PACKET_SIZE); memcpy(pktRet.raw, ret, PACKET_SIZE); std::string result = Packet::diff(pktOrig, pktRet); std::cout << result; sendAll(client_socket, result.c_str(), result.size()); } void TcpServer::cleanup() { if (client_socket != -1) { close(client_socket); client_socket = -1; } if (server_fd != -1) { close(server_fd); server_fd = -1; } } bool TcpServer::start(int port) { return createSocket() && bindSocket(port) && listenForClient(); } void TcpServer::run() { std::cout << "Сервер запущен на порту " << PORT << ", ожидание клиента...\n"; if (!acceptClient()) return; uint8_t original[PACKET_SIZE]; if (!recvPacket(original, PACKET_SIZE)) return; std::cout << "Получен исходный пакет (" << PACKET_SIZE << " байт):\n"; std::cout << packetToHex(*reinterpret_cast<Packet*>(original)) << "\n"; if (!sendPacket(original, PACKET_SIZE)) return; std::cout << "Эхо отправлено клиенту\n"; uint8_t returned[PACKET_SIZE]; if (!recvPacket(returned, PACKET_SIZE)) return; std::cout << "Получен возвращённый пакет (" << PACKET_SIZE << " байт):\n"; std::cout << packetToHex(*reinterpret_cast<Packet*>(returned)) << "\n"; comparePackets(original, returned); std::cout << "\nСервер завершил работу.\n"; } int main() { TcpServer server; if (!server.start(PORT)) return 1; server.run(); return 0; }