/*! @file client.cpp Исходный файл клиента для игры в лабиринт на базе сокетов. @author ParkSuMin @date 2025.04.30 */ #include "client.hpp" // void print_instructions() { // std::cout << "Доступные команды:" << std::endl; // std::cout << " - вперёд" << std::endl; // std::cout << " - направо" << std::endl; // std::cout << " - налево" << std::endl; // std::cout << " - назад" << std::endl; // std::cout << " - сдаюсь" << std::endl; // std::cout << "Введите команду для хода" << std::endl; // } int Client::ping(struct sockaddr_in address){ return connect(sock, (struct sockaddr*)&address, sizeof(address)) != 0; } Client::Client(){ // Создание сокета if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) { throw std::runtime_error("Error in socket create"); } } void Client::run(const std::string& h, const unsigned short p) { struct sockaddr_in serv_addr; serv_addr.sin_family = AF_INET; hostent* host_name; host_name = gethostbyname(h.c_str()); // Преобразование названия хоста в IP-адрес. if (host_name == nullptr) { throw std::runtime_error("Error in get hostname"); } serv_addr.sin_port = htons(p); memcpy(&serv_addr.sin_addr.s_addr, host_name->h_addr, host_name->h_length); // Подключение к серверу if (ping(serv_addr)) { throw std::runtime_error("Invalid hostname:port"); } std::cout << "Подключено к серверу. Введите ваше имя: "; std::string player_name; std::getline(std::cin, player_name); if (player_name.empty() || player_name.size() > BUFFER_SIZE) { throw std::runtime_error("Incorrect name!"); } if (!ping(serv_addr)) { throw std::runtime_error("Connection lost!"); } // Отправка имени игрока на сервер send(sock, player_name.c_str(), player_name.size(), 0); } void Client::game(){ std::cout << "Игра началась!" << std::endl; //print_instructions(); char buffer[BUFFER_SIZE] = {0}; while (true) { std::cout << "Введите команду: "; std::string command; std::getline(std::cin, command); if (command.empty() || command.size() > BUFFER_SIZE) { std::cout << "Некорректная команда" << std::endl; continue; } // Отправка команды на сервер send(sock, command.c_str(), command.size(), 0); // Получение ответа от сервера memset(buffer, 0, sizeof(buffer)); int bytes_received = recv(sock, buffer, sizeof(buffer), 0); if (bytes_received == 0 || bytes_received > BUFFER_SIZE) { throw std::runtime_error("Connection lost!"); //break; } std::string response(buffer); std::cout << "Ответ сервера: " << response << std::endl; // Проверка завершения игры if (response.find("вы выиграли") != std::string::npos || response.find("вы проиграли") != std::string::npos) { break; } } close(sock); }