diff --git a/Makefile b/Makefile index e54b9b6..7e724d1 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ OBJ = ${SRC:.cpp=.o} CXX = c++ -CXXFLAGS = -std=c++98 -fsanitize=address -g3#-Wall -Wextra -Werror +CXXFLAGS = -std=c++98 -fsanitize=address -g3 #-Wall -Wextra -Werror all : $(NAME) diff --git a/Server.cpp b/Server.cpp index 4decd3b..8ecda1f 100644 --- a/Server.cpp +++ b/Server.cpp @@ -34,6 +34,46 @@ void Server::init() { signal(SIGINT, receiveSignal); signal(SIGQUIT, receiveSignal); + createServerSocket(); std::cout << ">>> SERVER STARTED <<<" << std::endl; std::cout << "Waiting for connections..." << std::endl; -} \ No newline at end of file +} + +void Server::createServerSocket() { + _serverSocketFd = socket(AF_INET, SOCK_STREAM, 0); + if (_serverSocketFd == -1) + throw std::runtime_error("Error: failed to create socket"); + + int optval = 1; + if (setsockopt(_serverSocketFd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)) == -1) + throw std::runtime_error("Error: setsockopt() failed"); + + if (fcntl(_serverSocketFd, F_SETFL, O_NONBLOCK) == -1) + throw std::runtime_error("Error: fcntl() failed"); + + bindServerSocket(); + + if (listen(_serverSocketFd, SOMAXCONN) == -1) + throw std::runtime_error("Error: listen() failed"); + + addPollfd(_serverSocketFd, POLLIN, 0); + +} + +void Server::bindServerSocket() { + struct sockaddr_in sa; + sa.sin_family = AF_INET; + sa.sin_port = htons(_port); + sa.sin_addr.s_addr = INADDR_ANY; + if (bind(_serverSocketFd, (struct sockaddr*)&sa, sizeof(sa)) == -1) { + throw std::runtime_error("Error: failed to bind socket"); + } +} + +void Server::addPollfd(int fd, short events, short revents) { + struct pollfd newPollfd; + newPollfd.fd = fd; + newPollfd.events = events; + newPollfd.revents = revents; + _fds.push_back(newPollfd); +} diff --git a/Server.hpp b/Server.hpp index 6af01cc..fd096af 100644 --- a/Server.hpp +++ b/Server.hpp @@ -4,12 +4,18 @@ #include #include #include +#include +#include +#include +#include class Server { private: int _port; + int _serverSocketFd; static bool _signal; std::string _password; + std::vector _fds; public: Server(); ~Server(); @@ -18,6 +24,10 @@ class Server { static void receiveSignal(int signum); void init(); + void createServerSocket(); + void bindServerSocket(); + void addPollfd(int fd, short events, short revents); + }; #endif \ No newline at end of file