Added PollManager class

This commit is contained in:
ouafabulous 2025-05-19 20:23:22 +02:00
parent 53a83308de
commit 4a17d88d80
7 changed files with 179 additions and 37 deletions

View file

@ -0,0 +1,50 @@
/******************************************************************************/
/* */
/* ::: :::::::: */
/* pollManager.cpp :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: omoudni <omoudni@student.42paris.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/05/19 19:15:48 by omoudni #+# #+# */
/* Updated: 2025/05/19 20:21:11 by omoudni ### ########.fr */
/* */
/******************************************************************************/
#include "pollManager.hpp"
#include <algorithm>
PollManager::PollManager() {}
void PollManager::addFd(int fd, short events) {
struct pollfd pfd = {fd, events, 0};
_fds.push_back(pfd);
_fd_events[fd] = events;
}
void PollManager::removeFd(int fd) {
for (std::vector<struct pollfd>::iterator it = _fds.begin(); it != _fds.end(); ) {
if (it->fd == fd)
it = _fds.erase(it);
else
++it;
}
_fd_events.erase(fd);
}
void PollManager::updateFd(int fd, short events) {
for (size_t i = 0; i < _fds.size(); ++i) {
if (_fds[i].fd == fd) {
_fds[i].events = events;
break;
}
}
_fd_events[fd] = events;
}
int PollManager::pollEvents(int timeout) {
return poll(_fds.data(), _fds.size(), timeout);
}
const std::vector<struct pollfd>& PollManager::getFds() const {
return _fds;
}

View file

@ -1,14 +1,14 @@
/* ************************************************************************** */
/******************************************************************************/
/* */
/* ::: :::::::: */
/* server.cpp :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: omoudni <omoudni@student.42.fr> +#+ +:+ +#+ */
/* By: omoudni <omoudni@student.42paris.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/05/13 11:11:07 by rparodi #+# #+# */
/* Updated: 2025/05/14 23:32:21 by omoudni ### ########.fr */
/* Updated: 2025/05/19 20:16:00 by omoudni ### ########.fr */
/* */
/* ************************************************************************** */
/******************************************************************************/
#include "color.hpp"
#include "server.hpp"
@ -67,17 +67,48 @@ void Server::start() {
close(server_fd);
return;
}
_pollManager.addFd(server_fd, POLLIN);
std::cout << CLR_GREEN << "Server started on port " << this->_port << CLR_RESET << std::endl;
std::cout << CLR_GREEN << "Waiting for clients..." << CLR_RESET << std::endl;
while (true) {
int client_fd = accept(server_fd, NULL, NULL);
if (client_fd == -1) {
std::cerr << CLR_RED << "Error: Failed to accept client" << CLR_RESET << std::endl;
continue;
}
std::cout << CLR_GREEN << "Client connected" << CLR_RESET << std::endl;
close(client_fd);
}
while (true) {
int n = _pollManager.pollEvents();
if (n < 0) {
std::cerr << CLR_RED << "Poll error" << CLR_RESET << std::endl;
break;
}
const std::vector<struct pollfd>& fds = _pollManager.getFds();
for (size_t i = 0; i < fds.size(); ++i) {
if (fds[i].revents & POLLIN) {
if (fds[i].fd == server_fd) {
// Accept new client
int client_fd = accept(server_fd, NULL, NULL);
if (client_fd != -1) {
_pollManager.addFd(client_fd, POLLIN);
std::cout << CLR_GREEN << "Client connected" << CLR_RESET << std::endl;
std::cout << "Welcome to IRC. Your client_id is: " << client_fd << std::endl;
} else {
std::cerr << CLR_RED << "Error: Failed to accept client" << CLR_RESET << std::endl;
}
} else {
// Handle client communication
char buffer[1024];
ssize_t bytes_received = recv(fds[i].fd, buffer, sizeof(buffer) - 1, 0);
if (bytes_received <= 0) {
// Client disconnected
// if it's negative, it means an error occurred, maybe print it with perror?
std::cout << CLR_RED << "Client disconnected" << CLR_RESET << std::endl;
close(fds[i].fd);
_pollManager.removeFd(fds[i].fd);
} else {
buffer[bytes_received] = '\0';
std::cout << "Received: " << buffer << std::endl;
// Optionally: send response to client here
}
}
}
}
}
close(server_fd);
std::cout << CLR_GREEN << "Server stopped" << CLR_RESET << std::endl;
}