diff --git a/Server/Server.cpp b/Server/Server.cpp index 47b424a..9f982cb 100644 --- a/Server/Server.cpp +++ b/Server/Server.cpp @@ -6,36 +6,94 @@ /* By: iherman- 65535) + if (port_ < 1 || port_ > 65535) throw std::runtime_error("Invalid port"); - std::cout << "Server port: " << port << "\nServer Password: " << password << std::endl; + if (password_.empty()) + throw std::runtime_error("Empty password"); + + serverSocket_ = socket(AF_INET, SOCK_STREAM, 0); + if (serverSocket_ < 0) + throw std::runtime_error("Failed to create socket"); + + struct sockaddr_in addr; + std::memset(&addr, 0, sizeof(addr)); + + addr.sin_family = AF_INET; + addr.sin_port = htons(port_); + addr.sin_addr.s_addr = INADDR_ANY; + + if (bind(serverSocket_, (struct sockaddr*)&addr, sizeof(addr))) + throw std::runtime_error("Failed to bind"); + + if (listen(serverSocket_, kConnectionQueueLimit)) + throw std::runtime_error("Failed to listen"); + + std::cout << "Server port: " << port_ + << "\nServer Password: " << password_ + << std::endl; } Server::~Server() { - + close(serverSocket_); } Server &Server::operator=(const Server& other) { if (this != &other) { - std::cout << "operator= called" << std::endl; + port_ = other.port_; + serverSocket_ = other.serverSocket_; + password_ = other.password_; } return *this; +} + +void Server::run() +{ + const std::size_t kBufferSize = 1024; + char buffer[kBufferSize] = {0}; + + struct sockaddr_in client_addr; + socklen_t client_addr_size = sizeof(client_addr); + int clientSocket = accept(serverSocket_, (struct sockaddr*)&client_addr, &client_addr_size); + + std::string message; + while (true) + { + int recv_amount = recv(clientSocket, buffer, kBufferSize, 0); + + if (recv_amount <= 0) + break ; + + message.append(buffer, recv_amount); + + if (message.find('\n') != std::string::npos) + break ; + } + + message = "Server received: " + message; + send(clientSocket, message.c_str(), message.size(), 0); + close(clientSocket); } \ No newline at end of file diff --git a/Server/Server.hpp b/Server/Server.hpp index ddb87fa..05760c6 100644 --- a/Server/Server.hpp +++ b/Server/Server.hpp @@ -6,7 +6,7 @@ /* By: iherman- // C++ lib functions -#include +# include # include -# include +# include + +# define PORT_DEFAULT 9898 class Server { private: + static const int kConnectionQueueLimit; + + int port_; + int serverSocket_; + + std::string password_; public: Server(); @@ -48,6 +56,8 @@ class Server ~Server(); Server &operator=(const Server& other); + + void run(); }; #endif // SERVER_HPP \ No newline at end of file diff --git a/main.cpp b/main.cpp index 8a2144d..015361c 100644 --- a/main.cpp +++ b/main.cpp @@ -6,11 +6,12 @@ /* By: iherman- int get_port(const char* arg) { @@ -38,12 +39,11 @@ int main(int argc, char *argv[]) { int port = get_port(argv[1]); Server server(port, argv[2]); + server.run(); } catch (std::exception& e) { std::cerr << e.what() << std::endl; return 1; } - - // run server } \ No newline at end of file