Something went wrong. Try again.
An HTTP server written in C++98 projects.intra.42.fr/projects/webserv
Something went wrong. Try again.
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677#include "Client.hpp"#include "config/config.hpp"#include "Server.hpp"
#include <iostream>#include <netinet/in.h>#include <stdexcept>#include <sstream>#include <sys/socket.h>#include <sys/types.h>#include <unistd.h>
//TODO : make this compile (htons with a loop around vectors)
Server::Server(Config const& config) : _config(config){ this->_socket = socket(AF_INET, SOCK_STREAM, 0); if (this->_socket < 0) throw std::runtime_error("Couldn't create socket");
int opt = 1; setsockopt(this->_socket, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
const host_port& port = config.get_port(); sockaddr_in serverAddr; serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(port.port); serverAddr.sin_addr.s_addr = INADDR_ANY;
if (bind(this->_socket, reinterpret_cast<struct sockaddr *>(&serverAddr), sizeof(serverAddr)) < 0) throw std::runtime_error("Couldn't bind the socket"); if (listen(this->_socket, 20) < 0) throw std::runtime_error("Couldn't listen to the socket");}
Server::~Server(){ this->disconnect();}
void Server::receive(std::vector<Pollable*>& pollables){ int acceptFd = ::accept(_socket, NULL, NULL); if (acceptFd < 0) return;
std::stringstream ss; ss << "New client: " << acceptFd; log(ss.str());
pollables.push_back(new Client(acceptFd, get_config()));}
void Server::disconnect(){ if (_socket > 0) { shutdown(_socket, SHUT_RDWR); close(_socket); _socket = 0; }}
void Server::log(std::string message){ std::cout << "[Server] " << message << std::endl;}
int Server::get_fd() const{ return this->_socket;}
Config const& Server::get_config() const{ return _config;}