diff --git a/include/client.hpp b/include/client.hpp index a70d040..a3e66be 100644 --- a/include/client.hpp +++ b/include/client.hpp @@ -6,16 +6,15 @@ #include #include #include - -const int PORT = 8080; - +#include class Client{ private: int sock; public: - Client() : sock(0){}; - void run(); + Client(); + void run(const std::string& h = "localhost", const unsigned short p = 1024u); int ping(struct sockaddr_in); + void game(); }; #endif \ No newline at end of file diff --git a/include/server.hpp b/include/server.hpp index af190d0..f251b08 100644 --- a/include/server.hpp +++ b/include/server.hpp @@ -7,11 +7,11 @@ #include #include #include +#include #include #include -const int PORT = 8080; -const int MAX_CLIENTS = 100; +const int MAX_CLIENTS = 512; class Server { private: @@ -20,7 +20,7 @@ private: bool check_status(Maze& maze); public: Server() : service_mode(false){}; - void start(); // Запуск сервера + void start(const std::string& h = "localhost", const unsigned short p = 1024u); // Запуск сервера }; #endif \ No newline at end of file diff --git a/src/client/client.cpp b/src/client/client.cpp index 77abbed..f668981 100644 --- a/src/client/client.cpp +++ b/src/client/client.cpp @@ -11,28 +11,33 @@ void print_instructions() { } int Client::ping(struct sockaddr_in address){ - return connect(sock, (struct sockaddr*)&address, sizeof(address)) > 0; + return connect(sock, (struct sockaddr*)&address, sizeof(address)) != 0; } -void Client::run() { - struct sockaddr_in serv_addr; - +Client::Client(){ // Создание сокета if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) { throw std::runtime_error("[Client::request] connect(2) call error"); } +} + +void Client::run(const std::string& h, const unsigned short p) { + struct sockaddr_in serv_addr; serv_addr.sin_family = AF_INET; - serv_addr.sin_port = htons(PORT); - // Преобразование IP-адреса из текстового вида в бинарный - if (inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0) { - throw std::runtime_error("[Client::request] connect(2) call error"); + hostent* host_name; + host_name = gethostbyname(h.c_str()); // Преобразование названия хоста в IP-адрес. + 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); + // Подключение к серверу if (ping(serv_addr)) { - throw std::runtime_error("Connection lost!"); + throw std::runtime_error("Invalid hostname:port"); } std::cout << "Подключено к серверу. Введите ваше имя: "; @@ -44,8 +49,10 @@ void Client::run() { } // Отправка имени игрока на сервер send(sock, player_name.c_str(), player_name.size(), 0); - std::cout << "Игра началась!\n"; +} +void Client::game(){ + std::cout << "Игра началась!\n"; print_instructions(); char buffer[1024] = {0}; @@ -74,6 +81,5 @@ void Client::run() { break; } } - close(sock); } \ No newline at end of file diff --git a/src/client/client_main.cpp b/src/client/client_main.cpp index 15b6c27..6ecf37f 100644 --- a/src/client/client_main.cpp +++ b/src/client/client_main.cpp @@ -1,9 +1,27 @@ #include "client.hpp" -int main(){ +int main(int argc, char** argv){ + int opt; + std::string host = "localhost"; + short unsigned port = 1024u; + + while ((opt = getopt(argc, argv, "h:p:")) != -1) { + switch (opt) { + case 'h': + host = optarg; + break; + case 'p': + port = static_cast(atoi(optarg)); + break; + default: + break; + } + } + try { Client client; - client.run(); + client.run(host, port); + client.game(); } catch (const std::runtime_error& e){ std::cerr << "Client application error: " << e.what() << std::endl; return 1; diff --git a/src/server/server.cpp b/src/server/server.cpp index 668a6e3..e28427a 100644 --- a/src/server/server.cpp +++ b/src/server/server.cpp @@ -15,7 +15,7 @@ void Server::handle_client(int client_socket, bool mode) { // Получение имени игрока int bytes_received = recv(client_socket, buffer, sizeof(buffer), 0); if (bytes_received <= 0) { - std::cerr << "Ошибка получения имени игрока.\n"; + std::cout << "Ошибка получения имени игрока.\n"; close(client_socket); return; } @@ -104,42 +104,37 @@ void Server::handle_client(int client_socket, bool mode) { std::cout << "Игрок " << player_name << " отключился.\n"; } -void Server::start() { +void Server::start(const std::string& h, const unsigned short p) { int server_fd, new_socket; struct sockaddr_in address; - int opt = 1; - int addrlen = sizeof(address); if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) { - perror("Ошибка создания сокета"); - exit(EXIT_FAILURE); - } - - if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) { - perror("Ошибка настройки сокета"); - exit(EXIT_FAILURE); + throw std::runtime_error("Error in socket"); } address.sin_family = AF_INET; - address.sin_addr.s_addr = INADDR_ANY; - address.sin_port = htons(PORT); + 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) { - perror("Ошибка привязки сокета"); - exit(EXIT_FAILURE); + if (bind(server_fd, (struct sockaddr*)&address, sizeof(address)) != 0) { + throw std::runtime_error("Error in bind"); } if (listen(server_fd, MAX_CLIENTS) < 0) { - perror("Ошибка прослушивания"); - exit(EXIT_FAILURE); + throw std::runtime_error("Error in listen"); } - std::cout << "Сервер запущен на порту " << PORT << "\n"; + std::cout << "Сервер запущен на хосте " << h << " на порту " << p << std::endl; + int addrlen = sizeof(address); while (true) { if ((new_socket = accept(server_fd, (struct sockaddr*)&address, (socklen_t*)&addrlen)) < 0) { - perror("Ошибка принятия соединения"); - exit(EXIT_FAILURE); + throw std::runtime_error("Error in accept"); } std::cout << "Новое соединение установлено.\n"; diff --git a/src/server/server_main.cpp b/src/server/server_main.cpp index 15946c9..f5ffeb2 100644 --- a/src/server/server_main.cpp +++ b/src/server/server_main.cpp @@ -1,9 +1,34 @@ #include "server.hpp" int main(int argc, char **argv) { - - Server server; - server.start(); + int opt; + std::string host = "localhost"; + short unsigned port = 1024u; + while ((opt = getopt(argc, argv, "h:p:")) != -1) { + switch (opt) { + case 'h': + host = optarg; + break; + case 'p': + port = static_cast(atoi(optarg)); + break; + default: + break; + } + } + + try { + Server server; + server.start(host, port); + } catch (const std::runtime_error& e){ + std::cerr << "Client application error: " << e.what() << std::endl; + return 1; + } catch (...){ + std::cerr << "Unexpected error in client application" << std::endl; + return 2; + } + + std::cout << "Server application finished" << std::endl; return 0; } \ No newline at end of file