diff --git a/include/maze.hpp b/include/maze.hpp index 3c14a1d..392cf71 100644 --- a/include/maze.hpp +++ b/include/maze.hpp @@ -30,9 +30,5 @@ class Maze{ bool is_wall(int, int) const; void set_moves_left(int); - - //void generate_maze(); - //void print_maze_info(); - //void play_game(); }; #endif diff --git a/include/server.hpp b/include/server.hpp index f251b08..8e3cb16 100644 --- a/include/server.hpp +++ b/include/server.hpp @@ -16,11 +16,12 @@ const int MAX_CLIENTS = 512; class Server { private: bool service_mode; + int server_fd; void handle_client(int client_socket, bool _mode); // Принимает клиентский сокет bool check_status(Maze& maze); public: - Server() : service_mode(false){}; - void start(const std::string& h = "localhost", const unsigned short p = 1024u); // Запуск сервера + Server(const std::string& h = "localhost", const unsigned short p = 1024u, bool service_mode = false); + void start(); // Запуск сервера }; #endif \ No newline at end of file diff --git a/src/client/client.cpp b/src/client/client.cpp index f668981..6b36e82 100644 --- a/src/client/client.cpp +++ b/src/client/client.cpp @@ -31,7 +31,7 @@ void Client::run(const std::string& h, const unsigned short p) { if (host_name == nullptr) { throw std::runtime_error("Error in gethostbyname"); } - + serv_addr.sin_port = htons(p); memcpy(&serv_addr.sin_addr.s_addr, host_name->h_addr, host_name->h_length); @@ -44,9 +44,10 @@ void Client::run(const std::string& h, const unsigned short p) { std::string player_name; std::getline(std::cin, player_name); - if (ping(serv_addr)) { + if (!ping(serv_addr)) { throw std::runtime_error("Connection lost!"); } + // Отправка имени игрока на сервер send(sock, player_name.c_str(), player_name.size(), 0); } diff --git a/src/server/server.cpp b/src/server/server.cpp index e28427a..2794635 100644 --- a/src/server/server.cpp +++ b/src/server/server.cpp @@ -1,5 +1,28 @@ #include "server.hpp" +Server::Server(const std::string& h, const unsigned short p, bool service_mode){ + // Создание сокета. + server_fd = socket(AF_INET, SOCK_STREAM, 0); + if (server_fd < 0) { + throw std::runtime_error("[MultiprocessEchoServer::MultiprocessEchoServer] socket(2) call error"); + } + // Подготовка сетевого адреса для связывания. + sockaddr_in server_address; + memset(reinterpret_cast(&server_address), '\0', sizeof(server_address)); + server_address.sin_family = AF_INET; + hostent* host_name; + host_name = gethostbyname(h.c_str()); // Преобразование названия хоста в IP-адрес. + if (host_name == nullptr) { + throw std::runtime_error("[MultiprocessEchoServer::MultiprocessEchoServer] gethostbyname(3) call error"); + } + server_address.sin_port = htons(p); + memcpy(&server_address.sin_addr.s_addr, host_name->h_addr, host_name->h_length); + if (bind(server_fd, reinterpret_cast(&server_address), sizeof(server_address)) != 0) { + throw std::runtime_error("[MultiprocessEchoServer::MultiprocessEchoServer] bind(2) call error"); + } + std::cout << "Сервер запущен на хосте " << h << " на порту " << p << std::endl; +} + bool Server::check_status(Maze &maze) { return (!maze.test_mode && maze.get_moves_left() > 0); } @@ -104,36 +127,18 @@ void Server::handle_client(int client_socket, bool mode) { std::cout << "Игрок " << player_name << " отключился.\n"; } -void Server::start(const std::string& h, const unsigned short p) { - int server_fd, new_socket; - struct sockaddr_in address; - - if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) { - throw std::runtime_error("Error in socket"); - } - - address.sin_family = AF_INET; - hostent* host_name; - host_name = gethostbyname(h.c_str()); // Преобразование названия хоста в IP-адрес. - if (host_name == nullptr) { - throw std::runtime_error("Error in gethostbyname"); - } - address.sin_port = htons(p); - memcpy(&address.sin_addr.s_addr, host_name->h_addr, host_name->h_length); - - if (bind(server_fd, (struct sockaddr*)&address, sizeof(address)) != 0) { - throw std::runtime_error("Error in bind"); - } +void Server::start() { + int new_socket; if (listen(server_fd, MAX_CLIENTS) < 0) { throw std::runtime_error("Error in listen"); } - std::cout << "Сервер запущен на хосте " << h << " на порту " << p << std::endl; - + sockaddr address; int addrlen = sizeof(address); + socklen_t address_size = sizeof(address); while (true) { - if ((new_socket = accept(server_fd, (struct sockaddr*)&address, (socklen_t*)&addrlen)) < 0) { + if ((new_socket = accept(server_fd, (struct sockaddr*)&address, &address_size)) < 0) { throw std::runtime_error("Error in accept"); } diff --git a/src/server/server_main.cpp b/src/server/server_main.cpp index f5ffeb2..dbeab13 100644 --- a/src/server/server_main.cpp +++ b/src/server/server_main.cpp @@ -3,9 +3,10 @@ int main(int argc, char **argv) { int opt; std::string host = "localhost"; + bool service_mode = false; short unsigned port = 1024u; - while ((opt = getopt(argc, argv, "h:p:")) != -1) { + while ((opt = getopt(argc, argv, "h:p:s:")) != -1) { switch (opt) { case 'h': host = optarg; @@ -13,14 +14,16 @@ int main(int argc, char **argv) { case 'p': port = static_cast(atoi(optarg)); break; + case 's': + service_mode = true; default: break; } } try { - Server server; - server.start(host, port); + Server server(host, port, service_mode); + server.start(); } catch (const std::runtime_error& e){ std::cerr << "Client application error: " << e.what() << std::endl; return 1;