Change structure of code base
This commit is contained in:
@@ -30,9 +30,5 @@ class Maze{
|
|||||||
bool is_wall(int, int) const;
|
bool is_wall(int, int) const;
|
||||||
|
|
||||||
void set_moves_left(int);
|
void set_moves_left(int);
|
||||||
|
|
||||||
//void generate_maze();
|
|
||||||
//void print_maze_info();
|
|
||||||
//void play_game();
|
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -16,11 +16,12 @@ const int MAX_CLIENTS = 512;
|
|||||||
class Server {
|
class Server {
|
||||||
private:
|
private:
|
||||||
bool service_mode;
|
bool service_mode;
|
||||||
|
int server_fd;
|
||||||
void handle_client(int client_socket, bool _mode); // Принимает клиентский сокет
|
void handle_client(int client_socket, bool _mode); // Принимает клиентский сокет
|
||||||
bool check_status(Maze& maze);
|
bool check_status(Maze& maze);
|
||||||
public:
|
public:
|
||||||
Server() : service_mode(false){};
|
Server(const std::string& h = "localhost", const unsigned short p = 1024u, bool service_mode = false);
|
||||||
void start(const std::string& h = "localhost", const unsigned short p = 1024u); // Запуск сервера
|
void start(); // Запуск сервера
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -31,7 +31,7 @@ void Client::run(const std::string& h, const unsigned short p) {
|
|||||||
if (host_name == nullptr) {
|
if (host_name == nullptr) {
|
||||||
throw std::runtime_error("Error in gethostbyname");
|
throw std::runtime_error("Error in gethostbyname");
|
||||||
}
|
}
|
||||||
|
|
||||||
serv_addr.sin_port = htons(p);
|
serv_addr.sin_port = htons(p);
|
||||||
memcpy(&serv_addr.sin_addr.s_addr, host_name->h_addr, host_name->h_length);
|
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::string player_name;
|
||||||
std::getline(std::cin, player_name);
|
std::getline(std::cin, player_name);
|
||||||
|
|
||||||
if (ping(serv_addr)) {
|
if (!ping(serv_addr)) {
|
||||||
throw std::runtime_error("Connection lost!");
|
throw std::runtime_error("Connection lost!");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Отправка имени игрока на сервер
|
// Отправка имени игрока на сервер
|
||||||
send(sock, player_name.c_str(), player_name.size(), 0);
|
send(sock, player_name.c_str(), player_name.size(), 0);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,28 @@
|
|||||||
#include "server.hpp"
|
#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<char*>(&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<const sockaddr*>(&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) {
|
bool Server::check_status(Maze &maze) {
|
||||||
return (!maze.test_mode && maze.get_moves_left() > 0);
|
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";
|
std::cout << "Игрок " << player_name << " отключился.\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
void Server::start(const std::string& h, const unsigned short p) {
|
void Server::start() {
|
||||||
int server_fd, new_socket;
|
int 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");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (listen(server_fd, MAX_CLIENTS) < 0) {
|
if (listen(server_fd, MAX_CLIENTS) < 0) {
|
||||||
throw std::runtime_error("Error in listen");
|
throw std::runtime_error("Error in listen");
|
||||||
}
|
}
|
||||||
|
|
||||||
std::cout << "Сервер запущен на хосте " << h << " на порту " << p << std::endl;
|
sockaddr address;
|
||||||
|
|
||||||
int addrlen = sizeof(address);
|
int addrlen = sizeof(address);
|
||||||
|
socklen_t address_size = sizeof(address);
|
||||||
while (true) {
|
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");
|
throw std::runtime_error("Error in accept");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,9 +3,10 @@
|
|||||||
int main(int argc, char **argv) {
|
int main(int argc, char **argv) {
|
||||||
int opt;
|
int opt;
|
||||||
std::string host = "localhost";
|
std::string host = "localhost";
|
||||||
|
bool service_mode = false;
|
||||||
short unsigned port = 1024u;
|
short unsigned port = 1024u;
|
||||||
|
|
||||||
while ((opt = getopt(argc, argv, "h:p:")) != -1) {
|
while ((opt = getopt(argc, argv, "h:p:s:")) != -1) {
|
||||||
switch (opt) {
|
switch (opt) {
|
||||||
case 'h':
|
case 'h':
|
||||||
host = optarg;
|
host = optarg;
|
||||||
@@ -13,14 +14,16 @@ int main(int argc, char **argv) {
|
|||||||
case 'p':
|
case 'p':
|
||||||
port = static_cast<unsigned short>(atoi(optarg));
|
port = static_cast<unsigned short>(atoi(optarg));
|
||||||
break;
|
break;
|
||||||
|
case 's':
|
||||||
|
service_mode = true;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
Server server;
|
Server server(host, port, service_mode);
|
||||||
server.start(host, port);
|
server.start();
|
||||||
} catch (const std::runtime_error& e){
|
} catch (const std::runtime_error& e){
|
||||||
std::cerr << "Client application error: " << e.what() << std::endl;
|
std::cerr << "Client application error: " << e.what() << std::endl;
|
||||||
return 1;
|
return 1;
|
||||||
|
|||||||
Reference in New Issue
Block a user