From d2d8d2cdd99b2266e2af70097d407b3fc56ac6c8 Mon Sep 17 00:00:00 2001 From: kinou-p Date: Thu, 9 Feb 2023 15:42:52 +0100 Subject: [PATCH] authentification work pretty great, you can crtl+c client without bug so delete client work, and support multi connexion --- Makefile | 10 +-- includes/ft_irc.hpp | 113 ++++++++++++++++--------------- srcs/client_request.cpp | 30 ++++++-- srcs/commands/auth/nick.cpp | 19 +++++- srcs/commands/auth/pass.cpp | 16 ++--- srcs/commands/auth/user.cpp | 33 ++++++--- srcs/commands/auth/utils.cpp | 32 +++++++-- srcs/commands/channel/join.cpp | 13 ++++ srcs/commands/parse_commands.cpp | 8 +-- srcs/main.cpp | 10 ++- srcs/new_connection.cpp | 40 +++++++++-- srcs/server_loop.cpp | 45 ++++++------ srcs/start_server.cpp | 3 +- 13 files changed, 246 insertions(+), 126 deletions(-) create mode 100644 srcs/commands/channel/join.cpp diff --git a/Makefile b/Makefile index fe464e7..8ffce4e 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ # By: apommier +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2022/12/01 17:27:29 by apommier #+# #+# # -# Updated: 2023/02/07 14:47:20 by apommier ### ########.fr # +# Updated: 2023/02/09 14:35:20 by apommier ### ########.fr # # # # **************************************************************************** # @@ -25,8 +25,8 @@ SRCS := main.cpp\ commands/auth/utils.cpp CC = c++ -FLAGS = -g -#-Wall -Wextra -Werror +FLAGS = -g +#FLAGS2 = -Wall -Wextra -Werror -std=c++98 DIR_OBJ := obj DIR_INC = -I ./includes/ DIR_SRCS := ./srcs @@ -40,10 +40,10 @@ all: ${NAME} ${DIR_OBJ}/%.o: ${DIR_SRCS}/%.cpp mkdir -p ${dir $@} - ${CC} ${FLAGS} ${DIR_INC} -o $@ -c $< -MMD + ${CC} ${FLAGS} ${FLAGS2} ${DIR_INC} -o $@ -c $< -MMD ${NAME}: ${OBJS} - ${CC} ${FLAGS} ${OBJS} -o ${NAME} + ${CC} ${FLAGS} ${FLAGS2} ${OBJS} -o ${NAME} clean: ${RM} ${DIR_OBJ} diff --git a/includes/ft_irc.hpp b/includes/ft_irc.hpp index 92a69a0..edf95c4 100644 --- a/includes/ft_irc.hpp +++ b/includes/ft_irc.hpp @@ -6,7 +6,7 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/12/01 17:27:37 by apommier #+# #+# */ -/* Updated: 2023/02/07 20:25:26 by apommier ### ########.fr */ +/* Updated: 2023/02/09 14:41:14 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -21,6 +21,7 @@ #include //epoll ensemble #include //close() #include +#include #define MAX_EVENTS 5 #define READ_SIZE 10 @@ -35,46 +36,46 @@ struct fdList; /* *********************************COMMANDS********************************* */ /* ************************************************************************** */ - void PASS(std::string buffer, fdList allFds, int user); - void NICK(std::string buffer, fdList allFds, int user); - void USER(std::string buffer, fdList allFds, int user); - void SERVER(std::string buffer, fdList allFds, int user); - void OPER(std::string buffer, fdList allFds, int user); - void QUIT(std::string buffer, fdList allFds, int user); - void SQUIT(std::string buffer, fdList allFds, int user); - void JOIN(std::string buffer, fdList allFds, int user); - void PART(std::string buffer, fdList allFds, int user); - void MODE(std::string buffer, fdList allFds, int user); - void TOPIC(std::string buffer, fdList allFds, int user); - void NAMES(std::string buffer, fdList allFds, int user); - void LIST(std::string buffer, fdList allFds, int user); - void INVITE(std::string buffer, fdList allFds, int user); - void KICK(std::string buffer, fdList allFds, int user); - void VERSION(std::string buffer, fdList allFds, int user); - void STATS(std::string buffer, fdList allFds, int user); - void LINKS(std::string buffer, fdList allFds, int user); - void TIME(std::string buffer, fdList allFds, int user); - void CONNECT(std::string buffer, fdList allFds, int user); - void TRACE(std::string buffer, fdList allFds, int user); - void ADMIN(std::string buffer, fdList allFds, int user); - void INFO(std::string buffer, fdList allFds, int user); - void PRIVMSG(std::string buffer, fdList allFds, int user); - void NOTICE(std::string buffer, fdList allFds, int user); - void WHO(std::string buffer, fdList allFds, int user); - void WHOIS(std::string buffer, fdList allFds, int user); - void WHOWAS(std::string buffer, fdList allFds, int user); - void KILL(std::string buffer, fdList allFds, int user); - void PING(std::string buffer, fdList allFds, int user); - void PONG(std::string buffer, fdList allFds, int user); - void ERROR(std::string buffer, fdList allFds, int user); - void AWAY(std::string buffer, fdList allFds, int user); - void REHASH(std::string buffer, fdList allFds, int user); - void RESTART(std::string buffer, fdList allFds, int user); - void SUMMON(std::string buffer, fdList allFds, int user); - void USER(std::string buffer, fdList allFds, int user); - void OPERWALL(std::string buffer, fdList allFds, int user); - void USERHOST(std::string buffer, fdList allFds, int user); - void ISON(std::string buffer, fdList allFds, int user); + void PASS(std::string buffer, fdList &allFds, int userNbr); + void NICK(std::string buffer, fdList &allFds, int userNbr); + void USER(std::string buffer, fdList &allFds, int userNbr); + void SERVER(std::string buffer, fdList &allFds, int userNbr); + void OPER(std::string buffer, fdList &allFds, int userNbr); + void QUIT(std::string buffer, fdList &allFds, int userNbr); + void SQUIT(std::string buffer, fdList &allFds, int userNbr); + void JOIN(std::string buffer, fdList &allFds, int userNbr); + void PART(std::string buffer, fdList &allFds, int userNbr); + void MODE(std::string buffer, fdList &allFds, int userNbr); + void TOPIC(std::string buffer, fdList &allFds, int userNbr); + void NAMES(std::string buffer, fdList &allFds, int userNbr); + void LIST(std::string buffer, fdList &allFds, int userNbr); + void INVITE(std::string buffer, fdList &allFds, int userNbr); + void KICK(std::string buffer, fdList &allFds, int userNbr); + void VERSION(std::string buffer, fdList &allFds, int userNbr); + void STATS(std::string buffer, fdList &allFds, int userNbr); + void LINKS(std::string buffer, fdList &allFds, int userNbr); + void TIME(std::string buffer, fdList &allFds, int userNbr); + void CONNECT(std::string buffer, fdList &allFds, int userNbr); + void TRACE(std::string buffer, fdList &allFds, int userNbr); + void ADMIN(std::string buffer, fdList &allFds, int userNbr); + void INFO(std::string buffer, fdList &allFds, int userNbr); + void PRIVMSG(std::string buffer, fdList &allFds, int userNbr); + void NOTICE(std::string buffer, fdList &allFds, int userNbr); + void WHO(std::string buffer, fdList &allFds, int userNbr); + void WHOIS(std::string buffer, fdList &allFds, int userNbr); + void WHOWAS(std::string buffer, fdList &allFds, int userNbr); + void KILL(std::string buffer, fdList &allFds, int userNbr); + void PING(std::string buffer, fdList &allFds, int userNbr); + void PONG(std::string buffer, fdList &allFds, int userNbr); + void ERROR(std::string buffer, fdList &allFds, int userNbr); + void AWAY(std::string buffer, fdList &allFds, int userNbr); + void REHASH(std::string buffer, fdList &allFds, int userNbr); + void RESTART(std::string buffer, fdList &allFds, int userNbr); + void SUMMON(std::string buffer, fdList &allFds, int userNbr); + void USER(std::string buffer, fdList &allFds, int userNbr); + void OPERWALL(std::string buffer, fdList &allFds, int userNbr); + void USERHOST(std::string buffer, fdList &allFds, int userNbr); + void ISON(std::string buffer, fdList &allFds, int userNbr); /* ************************************************************************** */ @@ -146,16 +147,16 @@ struct functionTab //std::string (*cmdPtr[cmdNbr])(void) = - void (*cmdPtr[cmdNbr])(std::string buffer, fdList allFds, int user) = + void (*cmdPtr[cmdNbr])(std::string buffer, fdList &allFds, int userNbr) = { //ft_test //4. Détails des messages // //4.1 Etablissement de connexion - // PASS, - NICK - // USER, + PASS, + NICK, + USER // SERVER, // OPER, // QUIT, @@ -244,13 +245,16 @@ struct channelData -struct fdList //allFds in code +struct fdList //&allFds in code { struct epoll_event events[MAX_EVENTS]; int epollFd; int serverFd; - int userList[MAX_EVENTS]; //list of user's fd - clientData userData[MAX_EVENTS]; + //int userList[MAX_EVENTS]; //list of userNbr's fd + std::vector userList; + //clientData userData[MAX_EVENTS]; + std::vector userData; + int nbrUser; functionTab parsingTab; }; @@ -265,15 +269,16 @@ struct fdList //allFds in code void ft_error(std::string str); void close_fd(int fd); +void cmd_error(fdList &allFds, int userNbr, std::string error); +void split(std::string const &str, const char delim, std::vector &out); +void print_registered_msg(fdList &allFds, int userNbr); /* ************************************************************************** */ /* ******************************START SERVER******************************** */ /* ************************************************************************** */ -void cmd_error(fdList allFds, int user, std::string error); -void split(std::string const &str, const char delim, std::vector &out); void initialize(char **av); //1st -void start_loop(fdList allFds); //3rd +void start_loop(fdList &allFds); //3rd /* ************************************************************************** */ /* *****************************EPOLL UTILITY******************************** */ @@ -286,12 +291,12 @@ int epoll_start(); //2nd /* *************************CONNECTION AND REQUEST*************************** */ /* ************************************************************************** */ -void new_connection(fdList allFds, struct epoll_event newClient); -bool clientRequest(fdList allFds, int user); +void new_connection(fdList &allFds, struct epoll_event newClient); +bool clientRequest(fdList &allFds, int userNbr); /* ************************************************************************** */ /* ***************************COMMANDS PARSING******************************* */ /* ************************************************************************** */ -void parse_commands(std::string buffer, fdList allFds, int user); +void parse_commands(std::string buffer, fdList &allFds, int userNbr); diff --git a/srcs/client_request.cpp b/srcs/client_request.cpp index c5d0823..2d87530 100644 --- a/srcs/client_request.cpp +++ b/srcs/client_request.cpp @@ -6,25 +6,43 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/12/09 22:34:36 by apommier #+# #+# */ -/* Updated: 2023/02/07 11:24:51 by apommier ### ########.fr */ +/* Updated: 2023/02/09 15:07:06 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ #include "../includes/ft_irc.hpp" -bool clientRequest(fdList allFds, int user)//, +bool clientRequest(fdList &allFds, int userNbr)//, { - int clientFd = allFds.events[user].data.fd; + //int userFd = allFds.events[user].data.fd; char buf[1024] = {0}; + std::string buffer; size_t len = 1024; + //buf.reserve(1024); //se demerder pour join quand pas \n - std::cout << "client request!" << std::endl; - if (recv(clientFd, buf, len, 0) == -1) + // std::cout << "fd in client request " << allFds.userData[userNbr].fd << std::endl; + // std::cout << "fd of list in client request " << allFds.userList[userNbr] << std::endl; + // std::cout << "user nbr " << userNbr << std::endl; + + //std::cout << "client request!" << std::endl; + //if (recv(allFds.userData[userNbr].fd, buf, len, 0) == -1) + if (recv(allFds.userData[userNbr].fd, buf, len, 0) == -1) ft_error("recv() error"); + buffer = buf; + if (buffer.empty()) + { + //delete client + close(allFds.userData[userNbr].fd); + allFds.userData.erase(allFds.userData.begin() + userNbr); + allFds.userList.erase(allFds.userList.begin() + userNbr); + allFds.nbrUser--; + std::cout << "buffer empty\n"; + return (1); + } std::cout << "BUFFER: ---" << buf << "---" << std::endl; //split with \n and while (tab de split) -> parsing - parse_commands(buf, allFds, user); + parse_commands((std::string)buf, allFds, userNbr); return (1); } \ No newline at end of file diff --git a/srcs/commands/auth/nick.cpp b/srcs/commands/auth/nick.cpp index aae5d32..318a8d5 100644 --- a/srcs/commands/auth/nick.cpp +++ b/srcs/commands/auth/nick.cpp @@ -6,7 +6,7 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/02/06 14:28:38 by apommier #+# #+# */ -/* Updated: 2023/02/07 15:13:27 by apommier ### ########.fr */ +/* Updated: 2023/02/09 13:19:51 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,12 +15,25 @@ // ERR_NONICKNAMEGIVEN ERR_ERRONEUSNICKNAME // ERR_NICKNAMEINUSE ERR_NICKCOLLISION -void NICK(std::string buffer, fdList allFds, int user) +void NICK(std::string buffer, fdList &allFds, int userNbr) { std::vector splitBuff; split(buffer, ' ', splitBuff); + if (splitBuff.size() < 2) + { + cmd_error(allFds, allFds.userData[userNbr].fd, "431 * NICK :No nickname given\n"); + //write(allFds.userData[user].fd, "ERR_NEEDMOREPARAMS", 18); + return ; + } //if nickname ok then (another user has it? ) - allFds.userData[user].nickname = splitBuff[1]; + //ERR_NONICKNAMEGIVEN + allFds.userData[userNbr].nickname = splitBuff[1]; + if (!allFds.userData[userNbr].registered && !allFds.userData[userNbr].userName.empty()) + { + allFds.userData[userNbr].registered = 1; + print_registered_msg(allFds, userNbr); + } + return ; } \ No newline at end of file diff --git a/srcs/commands/auth/pass.cpp b/srcs/commands/auth/pass.cpp index 74e9e78..02b8a9d 100644 --- a/srcs/commands/auth/pass.cpp +++ b/srcs/commands/auth/pass.cpp @@ -6,33 +6,33 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/02/06 14:40:42 by apommier #+# #+# */ -/* Updated: 2023/02/07 19:40:34 by apommier ### ########.fr */ +/* Updated: 2023/02/09 13:20:00 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ #include "../../../includes/ft_irc.hpp" -void PASS(std::string buffer, fdList allFds, int user) +void PASS(std::string buffer, fdList &allFds, int userNbr) { std::string password; if (buffer.size() < 6)// ---PASS --- { - cmd_error(allFds, user, "461 * PASS :Not enough parameters"); + cmd_error(allFds, allFds.userData[userNbr].fd, "461 * PASS :Not enough parameters\n"); return ; } // if (splitBuff.size() != 2) // { - // cmd_error(allFds, user, "461 * PASS :Not enough parameters"); - // //write(allFds.userData[user].fd, "ERR_NEEDMOREPARAMS", 18); + // cmd_error(allFds, userNbr, "461 * PASS :Not enough parameters"); + // //write(allFds.userData[userNbr].fd, "ERR_NEEDMOREPARAMS", 18); // return ; // } - else if (allFds.userData[user].registered) + else if (allFds.userData[userNbr].registered) { - cmd_error(allFds, user, "462 * PASS :You may not reregister"); + cmd_error(allFds, allFds.userData[userNbr].fd, "462 * PASS :You may not reregister\n"); return ; } password = buffer.substr(5, buffer.npos); - allFds.userData[user].password = buffer; + allFds.userData[userNbr].password = buffer; } \ No newline at end of file diff --git a/srcs/commands/auth/user.cpp b/srcs/commands/auth/user.cpp index beff0dd..2869ce2 100644 --- a/srcs/commands/auth/user.cpp +++ b/srcs/commands/auth/user.cpp @@ -6,7 +6,7 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/02/06 14:40:39 by apommier #+# #+# */ -/* Updated: 2023/02/07 20:27:12 by apommier ### ########.fr */ +/* Updated: 2023/02/09 13:19:53 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -16,25 +16,36 @@ //Paramètres: : //ERR_NEEDMOREPARAMS ERR_ALREADYREGISTRED -void USER(std::string buffer, fdList allFds, int user) +void USER(std::string buffer, fdList &allFds, int userNbr) { + if (allFds.userData[userNbr].registered == 1) + { + cmd_error(allFds, allFds.userData[userNbr].fd, "462 * PASS :You may not reregister\n"); + return ; + } + std::string realName = buffer.substr(buffer.find_first_of(":") + 1 , buffer.npos); std::vector splitBuff; + buffer.resize(buffer.size() - realName.size()); - std::cout << "Buffer in user = ---" << buffer << "---" << std::endl; - std::cout << "realname in user = ---" << realName << "---" << std::endl; + std::cout << "Buffer in userNbr = ---" << buffer << "---" << std::endl; + std::cout << "realname in userNbr = ---" << realName << "---" << std::endl; split(buffer, ' ', splitBuff); if (splitBuff.size() < 4) { - cmd_error(allFds, user, "461 * PASS :Not enough parameters"); - //write(allFds.userData[user].fd, "ERR_NEEDMOREPARAMS", 18); + cmd_error(allFds, allFds.userData[userNbr].fd, "461 * PASS :Not enough parameters\n"); + //write(allFds.userData[userNbr].fd, "ERR_NEEDMOREPARAMS", 18); return ; } - allFds.userData[user].userName = splitBuff[1]; - allFds.userData[user].hostName = splitBuff[2]; - allFds.userData[user].serverName = splitBuff[3]; - - allFds.userData[user].realName = realName; + allFds.userData[userNbr].userName = splitBuff[1]; + allFds.userData[userNbr].hostName = splitBuff[2]; + allFds.userData[userNbr].serverName = splitBuff[3]; + allFds.userData[userNbr].realName = realName; + if (!allFds.userData[userNbr].nickname.empty()) + { + allFds.userData[userNbr].registered = 1; + print_registered_msg(allFds, userNbr); + } } \ No newline at end of file diff --git a/srcs/commands/auth/utils.cpp b/srcs/commands/auth/utils.cpp index 34fd09e..f963c7a 100644 --- a/srcs/commands/auth/utils.cpp +++ b/srcs/commands/auth/utils.cpp @@ -6,16 +6,22 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/02/07 14:45:45 by apommier #+# #+# */ -/* Updated: 2023/02/07 15:16:10 by apommier ### ########.fr */ +/* Updated: 2023/02/09 14:01:23 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ #include "../../../includes/ft_irc.hpp" -void cmd_error(fdList allFds, int user, std::string error) +void ft_putstr_fd(int fd, std::string str) { - write(allFds.userData[user].fd, ":irc.local ", error.size()); - write(allFds.userData[user].fd, error.c_str(), error.size()); + write(fd, str.c_str(), str.size()); + write(fd, "\n", 1); +} + +void cmd_error(fdList &allFds, int fd, std::string error) +{ + write(fd, ":irc.local ", 11); + write(fd, error.c_str(), error.size()); } void split(std::string const &str, const char delim, std::vector &out) @@ -28,4 +34,20 @@ void split(std::string const &str, const char delim, std::vector &o end = str.find(delim, start); out.push_back(str.substr(start, end - start)); } -} \ No newline at end of file +} + +void print_registered_msg(fdList &allFds, int userNbr) +{ + ft_putstr_fd(allFds.userData[userNbr].fd, "-------------------WELCOME TO MY PERSONNAL IRC SERVER!-------------------" ); + ft_putstr_fd(allFds.userData[userNbr].fd, "your nickname is |" + allFds.userData[userNbr].nickname ); + ft_putstr_fd(allFds.userData[userNbr].fd, "your password is |" + allFds.userData[userNbr].password ); + ft_putstr_fd(allFds.userData[userNbr].fd, "your username is |" + allFds.userData[userNbr].userName ); + ft_putstr_fd(allFds.userData[userNbr].fd, "your realname is |" + allFds.userData[userNbr].realName ); + ft_putstr_fd(allFds.userData[userNbr].fd, "your hostname is |" + allFds.userData[userNbr].hostName ); + ft_putstr_fd(allFds.userData[userNbr].fd, "your servername is |" + allFds.userData[userNbr].serverName ); +} + +// void delete_client(fdList &allFds) +// { + +// } \ No newline at end of file diff --git a/srcs/commands/channel/join.cpp b/srcs/commands/channel/join.cpp new file mode 100644 index 0000000..007a794 --- /dev/null +++ b/srcs/commands/channel/join.cpp @@ -0,0 +1,13 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* join.cpp :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: apommier +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2023/02/09 15:40:33 by apommier #+# #+# */ +/* Updated: 2023/02/09 15:40:41 by apommier ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "../../../includes/ft_irc.hpp" \ No newline at end of file diff --git a/srcs/commands/parse_commands.cpp b/srcs/commands/parse_commands.cpp index d551179..4321c83 100644 --- a/srcs/commands/parse_commands.cpp +++ b/srcs/commands/parse_commands.cpp @@ -6,7 +6,7 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/12/06 22:01:25 by apommier #+# #+# */ -/* Updated: 2023/02/07 15:18:41 by apommier ### ########.fr */ +/* Updated: 2023/02/09 13:20:39 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -18,7 +18,7 @@ std::string ft_test() return ("prout"); } -void parse_commands(std::string buffer, fdList allFds, int user) +void parse_commands(std::string buffer, fdList &allFds, int userNbr) { std::string cmd = buffer; std::vector splitBuff; @@ -32,7 +32,7 @@ void parse_commands(std::string buffer, fdList allFds, int user) while (splitBuff[0] != allFds.parsingTab.cmdName[a] && a < allFds.parsingTab.cmdNbr) a++; if (a == allFds.parsingTab.cmdNbr) - std::cout << "Command not found\n"; + std::cout << "Command not found\n"; else - allFds.parsingTab.cmdPtr[a](buffer, allFds, user); + allFds.parsingTab.cmdPtr[a](buffer, allFds, userNbr); } \ No newline at end of file diff --git a/srcs/main.cpp b/srcs/main.cpp index d9510f6..e170bd4 100644 --- a/srcs/main.cpp +++ b/srcs/main.cpp @@ -6,7 +6,7 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/12/01 17:27:33 by apommier #+# #+# */ -/* Updated: 2022/12/09 23:46:24 by apommier ### ########.fr */ +/* Updated: 2023/02/09 14:39:07 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -17,6 +17,14 @@ int main(int ac, char **av) if (!(ac == 3 || ac == 2)) ft_error("wrong number of arguments\nFORMAT: ./ircserv "); std::cout << "============Homemade IRC Server start============" << std::endl; + // try + // { + // initialize(av); + // } + // catch + // { + + // } initialize(av); return (0); } \ No newline at end of file diff --git a/srcs/new_connection.cpp b/srcs/new_connection.cpp index c49bd41..269f7e3 100644 --- a/srcs/new_connection.cpp +++ b/srcs/new_connection.cpp @@ -6,24 +6,56 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/12/09 22:26:27 by apommier #+# #+# */ -/* Updated: 2023/02/07 11:41:38 by apommier ### ########.fr */ +/* Updated: 2023/02/09 14:06:13 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ #include "../includes/ft_irc.hpp" -void new_connection(fdList allFds, struct epoll_event newClient) +void new_connection(fdList &allFds, struct epoll_event newClient) { struct sockaddr_in addr; int addrLen = sizeof(addr); - std::cout << "new connection !" << std::endl; + //std::cout << "in new adress " << &allFds << std::endl; + //std::cout << "new connection !" << std::endl; if (MAX_EVENTS == allFds.nbrUser) + { std::cout << "new connection refused, already full" << std::endl; + return ; + } + + int newUserFd; + allFds.userList.push_back(newUserFd); allFds.userList[allFds.nbrUser] = accept(allFds.serverFd, (struct sockaddr *)&addr, (socklen_t*)&addrLen); + std::cout << "newConnection | user fd = " << allFds.userList[allFds.nbrUser] << std::endl; + + clientData newElement; + allFds.userData.push_back(newElement); allFds.userData[allFds.nbrUser].fd = allFds.userList[allFds.nbrUser]; + std::cout << "newConnection | user in data fd = " << allFds.userData[allFds.nbrUser].fd << std::endl; + epoll_add(allFds.epollFd, allFds.userList[allFds.nbrUser]); allFds.nbrUser++; -} \ No newline at end of file +} + +// void new_connection(fdList *allFds, struct epoll_event newClient) +// { +// struct sockaddr_in addr; +// int addrLen = sizeof(addr); + +// std::cout << "new connection !" << std::endl; +// if (MAX_EVENTS == (*allFds).nbrUser) +// std::cout << "new connection refused, already full" << std::endl; +// (*allFds).userList[(*allFds).nbrUser] = accept((*allFds).serverFd, (struct sockaddr *)&addr, (socklen_t*)&addrLen); + +// std::cout << "newConnection | user fd = " << (*allFds).userList[(*allFds).nbrUser] << std::endl; + +// (*allFds).userData[(*allFds).nbrUser].fd = (*allFds).userList[(*allFds).nbrUser]; +// std::cout << "newConnection | user in data fd = " << (*allFds).userData[(*allFds).nbrUser].fd << std::endl; + +// epoll_add((*allFds).epollFd, (*allFds).userList[(*allFds).nbrUser]); +// (*allFds).nbrUser++; +// } \ No newline at end of file diff --git a/srcs/server_loop.cpp b/srcs/server_loop.cpp index a9e6b74..75fe5db 100644 --- a/srcs/server_loop.cpp +++ b/srcs/server_loop.cpp @@ -6,49 +6,46 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/12/06 21:58:13 by apommier #+# #+# */ -/* Updated: 2023/02/07 11:23:01 by apommier ### ########.fr */ +/* Updated: 2023/02/09 15:02:44 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ #include "../includes/ft_irc.hpp" -void start_loop(fdList allFds) +void start_loop(fdList &allFds) { bool alive = true; - char buffer[1024] = { 0 }; - //struct epoll_event events[MAX_EVENTS]; int readChar; int eventNbr; - + int i; + int userId; + int nbr; + std::cout << "serverFd: " << allFds.serverFd << std::endl; - //allFds.events //= allFds.events; while (alive) { - // std::cout << "hehe\n"; - // readChar = read(allFds.serverFd, buffer, 1024); - //recv(int allFds.serverFd, void *buf, size_t len, int flags); - //buffer[readChar] = '\0'; - - // send(clientFd, "message received", 18, 0); - eventNbr = epoll_wait(allFds.epollFd, allFds.events, MAX_EVENTS, 5000); - std::cout << "eventNbr: " << eventNbr << std::endl; - for (int i = 0; i < eventNbr ; i++) + //std::cout << "eventNbr: " << eventNbr << std::endl; + //std::cout << "in loop adress " << &allFds << std::endl; + for (i = 0; i < eventNbr ; i++) { std::cout << "event[i]'s fd: " << allFds.events[i].data.fd << std::endl; + std::cout << "i= " << i << std::endl; if (allFds.events[i].data.fd == allFds.serverFd) - new_connection(allFds, allFds.events[i]); - else if (!clientRequest(allFds, i))//allFds.events[i].data.fd)) { - alive = false; - //else - // std::cout << "F*CK i dont know" << std::endl; - //if (strncmp("QUIT", buffer, 4)) - // alive = 0; + new_connection(allFds, allFds.events[i]); + //std::cout << "after new fd loop " << allFds.userData[i].fd << std::endl; + } + else + { + nbr = find(allFds.userList.begin(), allFds.userList.end(), allFds.events[i].data.fd) - allFds.userList.begin(); + std::cout << "fd loop " << allFds.userData[nbr].fd << std::endl; + std::cout << "nbr loop " << nbr << std::endl; + //if (!clientRequest(allFds, i)) + if (!clientRequest(allFds, nbr)) + alive = false; } } - if (!strncmp("/quit", buffer, 5)) - std::cout << "quit message received\n"; } std::cout << "dead server\n"; diff --git a/srcs/start_server.cpp b/srcs/start_server.cpp index cf83f4d..bcd234f 100644 --- a/srcs/start_server.cpp +++ b/srcs/start_server.cpp @@ -6,7 +6,7 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/12/06 21:44:20 by apommier #+# #+# */ -/* Updated: 2023/02/06 12:32:07 by apommier ### ########.fr */ +/* Updated: 2023/02/09 13:50:16 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -58,6 +58,7 @@ void initialize(char **av) // } allFds.epollFd = epoll_start(); + //allFds.userData epoll_add(allFds.epollFd, allFds.serverFd); start_loop(allFds);