100 lines
3.3 KiB
C++
100 lines
3.3 KiB
C++
/*! @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);
|
|
} |