fixed data not received from client

This commit is contained in:
ouafabulous 2025-05-22 17:41:29 +02:00
parent bfe88daf3e
commit 1e66d6c33e
6 changed files with 66 additions and 52 deletions

View file

@ -20,15 +20,6 @@ PollManager::~PollManager()
void PollManager::pollLoop(int server_fd, std::vector<int> &newClients, std::vector<int> &disconnected, std::vector<std::pair<int, std::string> > &readyClients)
{
struct pollfd server_pollfd;
server_pollfd.fd = server_fd;
server_pollfd.events = POLLIN;
_fds.push_back(server_pollfd);
std::cout << "Serveur prêt à accepter des connexions..." << std::endl;
// while (true) {
int poll_count = poll(&_fds[0], _fds.size(), -1);
if (poll_count == -1)
{
@ -38,8 +29,8 @@ void PollManager::pollLoop(int server_fd, std::vector<int> &newClients, std::vec
}
for (size_t i = 0; i < _fds.size(); ++i)
{
short unsigned fd = _fds[i].fd;
short unsigned fd = _fds[i].fd;
std::cout << "I'm here 1" << std::endl;
if ((fd == server_fd) && (_fds[i].revents & POLLIN))
{
int client_fd = accept(server_fd, NULL, NULL);
@ -48,17 +39,19 @@ void PollManager::pollLoop(int server_fd, std::vector<int> &newClients, std::vec
std::cerr << "Error accept()" << std::endl;
continue;
}
addClient(client_fd);
std::cout << "I'm here 2" << std::endl;
addClient(client_fd);
newClients.push_back(client_fd);
}
else if (_fds[i].revents & POLLIN)
{
} else if (_fds[i].revents & POLLIN) {
std::cout << "I'm here 3" << std::endl;
char buffer[1024];
ssize_t bytes = recv(fd, buffer, sizeof(buffer) - 1, 0);
if (bytes > 0)
{
buffer[bytes] = '\0';
readyClients.push_back(std::make_pair(fd, std::string(buffer)));
std::cout << "Received data from fd " << fd << ": " << buffer << std::endl;
std::cout << std::flush;
}
else
{
@ -93,3 +86,11 @@ void PollManager::removeClient(short unsigned fd)
close(fd);
std::cout << "Client disconnected (fd " << fd << ")" << std::endl;
}
void PollManager::setServerFd(int fd)
{
struct pollfd pfd;
pfd.fd = fd;
pfd.events = POLLIN;
_fds.push_back(pfd);
}

View file

@ -6,13 +6,14 @@
/* By: omoudni <omoudni@student.42paris.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/05/13 11:11:07 by rparodi #+# #+# */
/* Updated: 2025/05/21 21:50:03 by omoudni ### ########.fr */
/* Updated: 2025/05/22 17:31:42 by omoudni ### ########.fr */
/* */
/******************************************************************************/
#include "color.hpp"
#include "server.hpp"
#include "core.hpp"
#include "PollManager.hpp"
#include <iostream>
#include <sys/socket.h>
#include <netinet/in.h>
@ -64,6 +65,7 @@ void Server::start() {
}
std::cout << "Serveur lancé sur le port " << _port << std::endl;
_pollManager.setServerFd(_serverFd);
std::vector<int> newClients;
std::vector<int> disconnected;
std::vector<std::pair<int, std::string> > readyClients;
@ -72,11 +74,12 @@ void Server::start() {
newClients.clear();
disconnected.clear();
readyClients.clear();
_pollManager.pollLoop(_serverFd, newClients, disconnected, readyClients);
_pollManager.pollLoop(_serverFd, newClients, disconnected,
readyClients);
std::cout << "Poll loop finished" << std::endl;
// Handle new clients
for (size_t i = 0; i < newClients.size(); ++i)
_users[newClients[i]] = new User(newClients[i]);
_users[newClients[i]] = new User(newClients[i]);
// Handle disconnected clients
for (size_t i = 0; i < disconnected.size(); ++i)
{

View file

@ -1,108 +0,0 @@
/******************************************************************************/
/* */
/* ::: :::::::: */
/* user.cpp :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: omoudni <omoudni@student.42paris.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/05/21 20:37:12 by omoudni #+# #+# */
/* Updated: 2025/05/21 21:44:58 by omoudni ### ########.fr */
/* */
/******************************************************************************/
#include "core.hpp"
// Constructor
User::User(short unsigned int fd) : _fd(fd), _registered(false), _hasNick(false), _hasUser(false) {}
// Getter for fd
short unsigned int User::getFd() const
{
return _fd;
}
// Getter for nickname
std::string User::getNickname() const
{
return _nickname;
}
void User::setUsername(const std::string &username)
{
_username = username;
_hasUser = true;
checkRegistration();
}
// Setter for nickname (with basic checks)
void User::setNickname(const std::string &nickname)
{
if (nickname.empty())
{
throw std::invalid_argument("Nickname cannot be empty");
}
else if (nickname == "anonymous")
{
throw std::invalid_argument("Nickname cannot be 'anonymous'");
}
else if (nickname.length() > 9)
{
throw std::length_error("Nickname is too long");
}
else if (nickname == _nickname)
{
throw std::invalid_argument("The nickname is the same");
}
else
{
_nickname = nickname;
_hasNick = true;
checkRegistration();
}
}
// Registration state
bool User::isRegistered() const
{
return _registered;
}
// Append to read buffer
void User::appendToReadBuffer(const std::string &data)
{
_read_buffer += data;
}
// Append to write buffer
void User::appendToWriteBuffer(const std::string &data)
{
_write_buffer += data;
}
// Check registration
void User::checkRegistration()
{
if (!_registered && _hasNick && _hasUser)
{
_registered = true;
}
}
// Check if the user is ready to send
bool User::isReadyToSend() const
{
return !_write_buffer.empty();
}
// Extract full command from read buffer
std::string User::extractFullCommand()
{
std::string command;
size_t pos = _read_buffer.find("\r\n");
if (pos != std::string::npos)
{
command = _read_buffer.substr(0, pos);
_read_buffer.erase(0, pos + 2);
}
return command;
}