diff --git a/Client.cpp b/Client.cpp new file mode 100644 index 0000000..fe3b1c6 --- /dev/null +++ b/Client.cpp @@ -0,0 +1,7 @@ +#include "Client.hpp" + +Client::Client() {} + +Client::Client(int fd, std::string addr) : _fd(fd), _addr(addr) {} + +Client::~Client() {} diff --git a/Client.hpp b/Client.hpp new file mode 100644 index 0000000..b9d1711 --- /dev/null +++ b/Client.hpp @@ -0,0 +1,17 @@ +#ifndef CLIENT_HPP +#define CLIENT_HPP + +#include + +class Client { + private: + int _fd; + std::string _addr; + public: + Client(); + Client(int fd, std::string addr); + ~Client(); + +}; + +#endif \ No newline at end of file diff --git a/Makefile b/Makefile index 7e724d1..36346bc 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ NAME = ircserv -SRC = main.cpp Server.cpp +SRC = main.cpp Server.cpp Client.cpp OBJ = ${SRC:.cpp=.o} diff --git a/Server.cpp b/Server.cpp index 766688e..0f04121 100644 --- a/Server.cpp +++ b/Server.cpp @@ -48,8 +48,7 @@ void Server::run() { for (size_t i = 0; i < _fds.size(); ++i) { if (_fds[i].revents & POLLIN) { if (_fds[i].fd == _serverSocketFd) - // handle new client connection here - continue; + handleClientConnection(); else // handle existing client incoming data here continue; @@ -95,3 +94,21 @@ void Server::addPollfd(int fd, short events, short revents) { newPollfd.revents = revents; _fds.push_back(newPollfd); } + +void Server::handleClientConnection() { + for (size_t i = 0; i < _fds.size(); ++i) { + if (_fds[i].fd == _serverSocketFd && (_fds[i].revents & POLLIN)) { + struct sockaddr_in client_addr; + socklen_t clientAddrSize = sizeof(sockaddr_in); + int newFd = accept(_serverSocketFd, (struct sockaddr *)&client_addr, &clientAddrSize); + if (newFd == -1) { + throw std::runtime_error("Error: accept() failed"); + } + + addPollfd(newFd, POLLIN, 0); + _clients.push_back(Client(newFd, inet_ntoa((client_addr.sin_addr)))); + + std::cout << "Client <" << newFd << "> Connected" << std::endl; + } + } +} \ No newline at end of file diff --git a/Server.hpp b/Server.hpp index d35c66b..2ca173c 100644 --- a/Server.hpp +++ b/Server.hpp @@ -8,6 +8,7 @@ #include #include #include +#include "Client.hpp" class Server { private: @@ -16,6 +17,7 @@ class Server { static bool _signal; std::string _password; std::vector _fds; + std::vector _clients; public: Server(); ~Server(); @@ -28,6 +30,7 @@ class Server { void createServerSocket(); void bindServerSocket(); void addPollfd(int fd, short events, short revents); + void handleClientConnection(); }; #endif \ No newline at end of file diff --git a/main.cpp b/main.cpp index f654858..48a478f 100644 --- a/main.cpp +++ b/main.cpp @@ -12,5 +12,6 @@ int main(int ac, char **av) std::cerr << e.what() << std::endl; return 1; } + std::cout << ">>> SERVER CLOSED <<<" << std::endl; return 0; }