add PRIVMSG and add reserve for vector of user and chanlist because POINTER VALIDITY

This commit is contained in:
kinou-p 2023-02-11 15:13:56 +01:00
parent 15d3dd47fd
commit 2ae3844245
15 changed files with 362 additions and 156 deletions

View File

@ -6,7 +6,7 @@
# By: apommier <apommier@student.42.fr> +#+ +:+ +#+ #
# +#+#+#+#+#+ +#+ #
# Created: 2022/12/01 17:27:29 by apommier #+# #+# #
# Updated: 2023/02/10 08:18:36 by apommier ### ########.fr #
# Updated: 2023/02/11 10:41:15 by apommier ### ########.fr #
# #
# **************************************************************************** #
@ -18,13 +18,15 @@ SRCS := main.cpp\
client_request.cpp\
new_connection.cpp\
server_loop.cpp\
commands/cmd_utils.cpp\
commands/parse_commands.cpp\
commands/auth/nick.cpp\
commands/auth/pass.cpp\
commands/auth/user.cpp\
commands/auth/cmd_utils.cpp\
commands/auth/auth_utils.cpp\
commands/channel/channel_utils.cpp\
commands/channel/join.cpp\
commands/channel/privmsg.cpp\
commands/not_done_cmd.cpp #special (temporary)
CC = c++

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2022/12/01 17:27:37 by apommier #+# #+# */
/* Updated: 2023/02/10 09:59:10 by apommier ### ########.fr */
/* Updated: 2023/02/11 14:48:19 by apommier ### ########.fr */
/* */
/* ************************************************************************** */
@ -20,12 +20,14 @@
#include <netinet/in.h> //struct socket
#include <sys/epoll.h> //epoll ensemble
#include <unistd.h> //close()
#include <fcntl.h> //fcntl
#include <vector>
#include <algorithm>
#include "function_tab.hpp"
#define MAX_EVENTS 5
#define MAX_CHAN 10
#define READ_SIZE 10
#define CMD_NBR 10
@ -35,7 +37,7 @@
struct channelData;
struct clientData
struct clientData //each client have one
{
bool registered;
@ -49,38 +51,30 @@ struct clientData
std::string serverName;
std::string cmdBuffer;
//std::string joinedChan[20];
//channelData *joinedChan; //is there a limit?
// std::vector<std::string> joinedChan;
std::vector<channelData *> joinedChan;
int fd;
};
struct channelData
struct channelData //each chan have one
{
//std::string userList[MAX_EVENTS];
//clientData userList[MAX_EVENTS];
std::string name;
std::vector<clientData> userList;
std::vector<clientData> banList;
std::vector<clientData *> userList;
std::vector<clientData *> banList;
int op;
int nbrUser;
};
struct fdList //&allFds in code
struct fdList //&allFds in code | /!\ only one on the server | REFERENCE ONLY
{
struct epoll_event events[MAX_EVENTS];
int epollFd;
int serverFd;
//int userList[MAX_EVENTS]; //list of userNbr's fd
std::vector<int> userList;
std::vector<channelData> channelList;
//clientData userData[MAX_EVENTS];
std::vector<clientData> userData;
// std::map<int, channelData> channelList;
// std::map<int, clientData> userData;
int nbrUser;
functionTab parsingTab;
@ -88,30 +82,45 @@ struct fdList //&allFds in code
/* ************************************************************************** */
/* *********************************UTILS************************************ */
/* ************************************************************************** */
void ft_putstr_fd(int fd, std::string str);
void cmd_error(fdList &allFds, int userNbr, std::string error);
void ft_error(std::string str);
void close_fd(int fd);
void del_user_in_chan(clientData *user, channelData *chan);
void delete_user(fdList &allFds, int userNbr);
/* ************************************************************************** */
/* *******************************AUTH UTILS********************************* */
/* ************************************************************************** */
void print_registered_msg(fdList &allFds, int userNbr);
/* ************************************************************************** */
/* *******************************CMD UTILS********************************** */
/* ************************************************************************** */
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<std::string> &out);
void print_registered_msg(fdList &allFds, int userNbr);
void split_but_keep(std::string const &str, const char delim, std::vector<std::string> &out); //same as split but keep one delimeter
/* ************************************************************************** */
/* *******************************CHAN UTILS********************************* */
/* ************************************************************************** */
int find_channel(fdList &allFds, std::string chanName);
int find_user(fdList &allFds, std::string userName);
void send_msg(fdList &allFds, std::string msg, std::string dest, int userNbr); //in privmsg.cpp
/* ************************************************************************** */
/* ******************************START SERVER******************************** */
/* ************************************************************************** */
void initialize(char **av); //1st
void start_loop(fdList &allFds); //3rd
void initialize(char **av); //start_server.cpp
void start_loop(fdList &allFds); //server_loop.cpp
/* ************************************************************************** */
/* *****************************EPOLL UTILITY******************************** */

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2022/12/09 22:34:36 by apommier #+# #+# */
/* Updated: 2023/02/09 21:39:38 by apommier ### ########.fr */
/* Updated: 2023/02/11 13:20:49 by apommier ### ########.fr */
/* */
/* ************************************************************************** */
@ -33,16 +33,24 @@ bool clientRequest(fdList &allFds, int userNbr)//,
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";
delete_user(allFds, userNbr);
// 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;
//std::cout << "BUFFER: ---" << buf << "---" << std::endl;
//split with \n and while (tab de split) -> parsing
parse_commands(buf, allFds, userNbr);
std::vector<std::string> splitBuff;
split_but_keep(buffer, '\n', splitBuff);
for (size_t i = 0; i < splitBuff.size(); i++)
{
parse_commands(splitBuff[i], allFds, userNbr);
}
return (1);
}

View File

@ -1,42 +1,17 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* cmd_utils.cpp :+: :+: :+: */
/* auth_utils.cpp :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/07 14:45:45 by apommier #+# #+# */
/* Updated: 2023/02/10 09:27:27 by apommier ### ########.fr */
/* Updated: 2023/02/11 10:40:42 by apommier ### ########.fr */
/* */
/* ************************************************************************** */
#include "../../../includes/ft_irc.hpp"
void ft_putstr_fd(int fd, std::string str)
{
write(fd, str.c_str(), str.size());
write(fd, "\n", 1);
}
void cmd_error(fdList &allFds, int fd, std::string error)
{
(void)allFds; //to delete
write(fd, ":irc.local ", 11);
write(fd, error.c_str(), error.size());
}
void split(std::string const &str, const char delim, std::vector<std::string> &out)
{
size_t start;
size_t end = 0;
while ((start = str.find_first_not_of(delim, end)) != std::string::npos)
{
end = str.find(delim, start);
out.push_back(str.substr(start, end - start));
}
}
void print_registered_msg(fdList &allFds, int userNbr)
{
ft_putstr_fd(allFds.userData[userNbr].fd, "-------------------WELCOME TO MY PERSONNAL IRC SERVER!-------------------" );

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/06 14:40:39 by apommier #+# #+# */
/* Updated: 2023/02/09 13:19:53 by apommier ### ########.fr */
/* Updated: 2023/02/11 12:57:50 by apommier ### ########.fr */
/* */
/* ************************************************************************** */
@ -18,34 +18,38 @@
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 ;
}
(void)buffer;
(void)allFds;
(void)userNbr;
// if (allFds.userData[userNbr].registered == 1)
// {
// cmd_error(allFds, allFds.userData[userNbr].fd, "462 * USER :You may not reregister\n");
// return ;
// }
std::string realName = buffer.substr(buffer.find_first_of(":") + 1 , buffer.npos);
std::vector<std::string> splitBuff;
// std::string realName = buffer.substr(buffer.find_first_of(":") + 1 , buffer.npos);
// std::vector<std::string> splitBuff;
buffer.resize(buffer.size() - realName.size());
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, allFds.userData[userNbr].fd, "461 * PASS :Not enough parameters\n");
//write(allFds.userData[userNbr].fd, "ERR_NEEDMOREPARAMS", 18);
return ;
}
allFds.userData[userNbr].userName = splitBuff[1];
allFds.userData[userNbr].hostName = splitBuff[2];
allFds.userData[userNbr].serverName = splitBuff[3];
// buffer.resize(buffer.size() - realName.size());
// 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, allFds.userData[userNbr].fd, "461 * USER :Not enough parameters\n");
// //write(allFds.userData[userNbr].fd, "ERR_NEEDMOREPARAMS", 18);
// return ;
// }
// 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);
}
// allFds.userData[userNbr].realName = realName;
// if (!allFds.userData[userNbr].nickname.empty())
// {
// allFds.userData[userNbr].registered = 1;
// print_registered_msg(allFds, userNbr);
// }
}

View File

@ -6,22 +6,43 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/09 17:21:57 by apommier #+# #+# */
/* Updated: 2023/02/09 20:56:31 by apommier ### ########.fr */
/* Updated: 2023/02/11 12:25:58 by apommier ### ########.fr */
/* */
/* ************************************************************************** */
#include "../../../includes/ft_irc.hpp"
int find_channel(fdList &allFds, std::string chanName)
int find_channel(fdList &allFds, std::string chanName)//return channel nbr
{
std::vector<channelData>::iterator start = allFds.channelList.begin();
std::vector<channelData>::iterator pastEnd = allFds.channelList.end();
std::cout << "name1= ---" << chanName << "---\n";
while (start != pastEnd)
{
std::cout << "result in find chan = " << pastEnd - start << std::endl;
if (allFds.channelList[pastEnd - start].name == chanName)
return (pastEnd - start);
std::cout << "name2= ---" << allFds.channelList[pastEnd - start - 1].name << "---\n";
if (allFds.channelList[pastEnd - start - 1].name == chanName)
return (pastEnd - start - 1);
start++;
}
return (0);
}
std::cout << "chan not found\n";
return (-1);
}
int find_user(fdList &allFds, std::string userName)//return direct user fd
{
std::vector<clientData>::iterator start = allFds.userData.begin();
std::vector<clientData>::iterator pastEnd = allFds.userData.end();
std::cout << "name1= ---" << userName << "---\n";
while (start != pastEnd)
{
std::cout << "result in find user = " << pastEnd - start << std::endl;
std::cout << "name2= ---" << allFds.userData[pastEnd - start - 1].nickname << "---\n";
if (allFds.userData[pastEnd - start - 1].nickname == userName)
return (allFds.userData[pastEnd - start - 1].fd);
start++;
}
std::cout << "user not found\n";
return (-1);
}

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/09 15:40:33 by apommier #+# #+# */
/* Updated: 2023/02/09 21:55:57 by apommier ### ########.fr */
/* Updated: 2023/02/11 14:55:28 by apommier ### ########.fr */
/* */
/* ************************************************************************** */
@ -16,7 +16,15 @@ void JOIN(std::string buffer, fdList &allFds, int userNbr)
{
std::vector<std::string> splitBuff;
int chanNbr;
std::cout << "join start\n";
std::cout << "==========join start========\n";
if (allFds.channelList.size() == MAX_CHAN)
{
std::cout << "creation of channel refused, maximum number reached" << std::endl; // send msg to user?
return ;
}
std::cout << "userNbr= " << userNbr << std::endl;
split(buffer, ' ', splitBuff);
if (splitBuff.size() < 2)
{
@ -25,25 +33,48 @@ void JOIN(std::string buffer, fdList &allFds, int userNbr)
}
chanNbr = find_channel(allFds, splitBuff[1]);
if (chanNbr)
if (chanNbr != -1) //chan already exist
{
//allFds.userData[userNbr].joinedChan.push_back(splitBuff[1]);
allFds.userData[userNbr].joinedChan.push_back(&allFds.channelList[chanNbr]); //add chan in user data
allFds.channelList[chanNbr].userList.push_back(&allFds.userData[userNbr]);//add user in chan data
allFds.channelList[chanNbr].nbrUser++;
std::cout << "join2 nickname " << allFds.channelList.back().userList[0]->nickname << std::endl;
std::cout << "join2 fd " << allFds.channelList.back().userList[0]->nickname << std::endl;
//allFds.channelList.push_back(new_chan);
//std::cout << "nbruser in existent chan / persistence = " << allFds.channelList[chanNbr].nbrUser << std::endl;
//std::cout << "nbruser in existent user / persistence = " << allFds.userData[userNbr].joinedChan[0]->nbrUser << std::endl;
//message nickname joined the channel?
}
else
else //chan doesn't exist yet
{
std::cout << "new chan\n";
channelData new_chan;
new_chan.name = splitBuff[1];
new_chan.nbrUser = 1;
new_chan.userList.push_back(&allFds.userData[userNbr]);
//new_chan.userList
allFds.channelList.push_back(new_chan);
allFds.userData[userNbr].joinedChan.push_back(&allFds.channelList.back());
allFds.userData[userNbr].joinedChan.push_back(&allFds.channelList.back());//add chan in user data
//allFds.channelList.back().userList.push_back(&allFds.userData[userNbr]);//add user in chan data
// allFds.userData[userNbr].joinedChan.push_back(&allFds.channelList[chanNbr]); //add chan in user data
// allFds.channelList[chanNbr].userList.push_back(&allFds.userData[userNbr]);//add user in chan data
// allFds.channelList[chanNbr].nbrUser++;
std::cout << "join nickname " << allFds.channelList[0].userList[0]->nickname << std::endl;
std::cout << "join fd " << allFds.channelList[0].userList[0]->fd << std::endl;
//ft_putstr_fd(allFds.channelList[fd].userList[i]->fd, fullMsg);
//std::cout << "loop here\n";
//message nickname created the channel?
}
std::cout << "============persitence test============\n";
allFds.channelList.back().name = "new name";
std::cout << "newname = " << allFds.userData[userNbr].joinedChan.back()->name << std::endl;
//allFds.channelList;
// std::cout << "============persitence test============\n";
// std::cout << "odlname = " << allFds.userData[userNbr].joinedChan.back()->name << std::endl;
// allFds.channelList.back().name = "new name";
// std::cout << "newname = " << allFds.userData[userNbr].joinedChan.back()->name << std::endl;
// //allFds.channelList;
}

View File

@ -0,0 +1,77 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* privmsg.cpp :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/11 08:53:03 by apommier #+# #+# */
/* Updated: 2023/02/11 12:38:51 by apommier ### ########.fr */
/* */
/* ************************************************************************** */
#include "../../../includes/ft_irc.hpp"
void PRIVMSG(std::string buffer, fdList &allFds, int userNbr)
{
std::vector<std::string> splitBuff;
std::string msg;
split(buffer, ' ', splitBuff);
if (splitBuff.size() < 3)
{
cmd_error(allFds, allFds.userData[userNbr].fd, "431 * PRIVMSG :Not enought argument\n");
//write(allFds.userData[user].fd, "ERR_NEEDMOREPARAMS", 18);
return ;
}
for (size_t i = 2; i < splitBuff.size(); i++)
{
msg += (" " + splitBuff[i]);
}
std::vector<std::string> dest;
split(splitBuff[1], ',', dest);
for (size_t i = 0; i < dest.size(); i++)
{
send_msg(allFds, msg, dest[i], userNbr);
}
}
void send_msg(fdList &allFds, std::string msg, std::string dest, int userNbr)
{
int fd;
//find dest
std::string fullMsg;
fullMsg = "*" + allFds.userData[userNbr].nickname + "* " + msg;
fd = find_channel(allFds, dest); //return channel nbr
if (fd != -1)
{
//std::vector<clientData *>::iterator start = allFds.channelList[fd].userList.begin();
//std::vector<clientData *>::iterator pastEnd = allFds.channelList[fd].userList.end();
// while (start != pastEnd)
// {
// std::cout << "send nickname" << (*start)->nickname << std::endl;
// ft_putstr_fd((*start)->fd, fullMsg);
// start++;
// std::cout << "loop here\n";
// }
for (size_t i = 0; i < allFds.channelList[fd].userList.size(); i++)
{
std::cout << "send nickname " << allFds.channelList[fd].userList[i]->nickname << std::endl;
ft_putstr_fd(allFds.channelList[fd].userList[i]->fd, fullMsg);
std::cout << "loop here\n";
}
return ;
}
fd = find_user(allFds, dest); //return direct user fd
if (fd != -1)
{
ft_putstr_fd(fd, fullMsg);
return ;
}
std::cout << "error msg\n";
//ft_putstr_fd(fd, msg);
}

View File

@ -0,0 +1,38 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* cmd_utils.cpp :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/10 15:46:10 by apommier #+# #+# */
/* Updated: 2023/02/11 13:51:28 by apommier ### ########.fr */
/* */
/* ************************************************************************** */
#include "../../includes/ft_irc.hpp"
void split(std::string const &str, const char delim, std::vector<std::string> &out)
{
size_t start;
size_t end = 0;
while ((start = str.find_first_not_of(delim, end)) != std::string::npos)
{
end = str.find(delim, start);
out.push_back(str.substr(start, end - start));
}
}
void split_but_keep(std::string const &str, const char delim, std::vector<std::string> &out)
{
size_t start;
size_t end = 0;
while ((start = str.find_first_not_of(delim, end)) != std::string::npos)
{
end = str.find(delim, start); //find end of string
out.push_back(str.substr(start, end + 1 - start)); //here
//std::cout << "split test = ---" << str.substr(start, end + 1 - start) << "---\n";
}
}

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/09 22:04:11 by apommier #+# #+# */
/* Updated: 2023/02/10 09:30:45 by apommier ### ########.fr */
/* Updated: 2023/02/11 08:53:59 by apommier ### ########.fr */
/* */
/* ************************************************************************** */
@ -164,13 +164,13 @@ void INFO(std::string buffer, fdList &allFds, int userNbr)
return ;
}
void PRIVMSG(std::string buffer, fdList &allFds, int userNbr)
{
(void)buffer;
(void)allFds;
(void)userNbr;
return ;
}
// void PRIVMSG(std::string buffer, fdList &allFds, int userNbr)
// {
// (void)buffer;
// (void)allFds;
// (void)userNbr;
// return ;
// }
void NOTICE(std::string buffer, fdList &allFds, int userNbr)
{

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2022/12/06 22:01:25 by apommier #+# #+# */
/* Updated: 2023/02/10 09:26:31 by apommier ### ########.fr */
/* Updated: 2023/02/11 15:11:24 by apommier ### ########.fr */
/* */
/* ************************************************************************** */
@ -21,6 +21,7 @@ std::string ft_test()
void parse_commands(std::string buffer, fdList &allFds, int userNbr)
{
//std::string cmd = buffer;
std::cout << "===========parse command=============" << std::endl;
std::vector<std::string> splitBuff;
int a = 0;
@ -30,16 +31,16 @@ void parse_commands(std::string buffer, fdList &allFds, int userNbr)
allFds.userData[userNbr].cmdBuffer.erase(allFds.userData[userNbr].cmdBuffer.size() - 1);
split(allFds.userData[userNbr].cmdBuffer, ' ', splitBuff);
std::cout << "BUFFER In PARSING: ---" << allFds.userData[userNbr].cmdBuffer << "---" << std::endl;
while (splitBuff[0] != allFds.parsingTab.cmdName[a] && a < allFds.parsingTab.cmdNbr)
//std::cout << "BUFFER In PARSING: ---" << allFds.userData[userNbr].cmdBuffer << "---" << std::endl;
while (a < allFds.parsingTab.cmdNbr - 1 && splitBuff[0] != allFds.parsingTab.cmdName[a])
a++;
std::cout << "after while \n";
if (a == allFds.parsingTab.cmdNbr)
//std::cout << "after while \n";
if (a == allFds.parsingTab.cmdNbr - 1)
std::cout << "Command not found\n";
else
{
std::cout << "Command name = " << allFds.parsingTab.cmdName[a] << std::endl;
std::cout << "Command nbr = " << a << std::endl;
//std::cout << "Command name = " << allFds.parsingTab.cmdName[a] << std::endl;
//std::cout << "Command nbr = " << a << std::endl;
allFds.parsingTab.cmdPtr[a](allFds.userData[userNbr].cmdBuffer, allFds, userNbr);
//allFds.parsingTab.cmdPtr[a]
//JOIN(allFds.userData[userNbr].cmdBuffer, allFds, userNbr);

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2022/12/09 22:26:27 by apommier #+# #+# */
/* Updated: 2023/02/10 09:19:45 by apommier ### ########.fr */
/* Updated: 2023/02/11 14:47:52 by apommier ### ########.fr */
/* */
/* ************************************************************************** */
@ -16,46 +16,38 @@ void new_connection(fdList &allFds)
{
struct sockaddr_in addr;
int addrLen = sizeof(addr);
int newFd;
std::cout << "==========newconnection========\n";
//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;
//int newUserFd;
//allFds.userList.push_back(newUserFd);
newFd = accept(allFds.serverFd, (struct sockaddr *)&addr, (socklen_t*)&addrLen);
//allFds.userList[allFds.nbrUser] = newFd;
allFds.userList.push_back(newFd);
//std::cout << "newConnection | old user fd = " << newFd << std::endl;
if (fcntl(newFd, F_SETFL, O_NONBLOCK) == -1)
ft_error("fctnl() error");
//std::cout << "fcntl return = " << newFd;
//close(newFd);
//std::cout << "newConnection | user fd = " << allFds.userList[allFds.nbrUser] << std::endl;
clientData newElement;
newElement.fd = newFd;
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;
//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++;
}
// 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++;
// }
}

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2022/12/06 21:58:13 by apommier #+# #+# */
/* Updated: 2023/02/10 09:20:58 by apommier ### ########.fr */
/* Updated: 2023/02/11 14:06:49 by apommier ### ########.fr */
/* */
/* ************************************************************************** */
@ -24,13 +24,16 @@ void start_loop(fdList &allFds)
std::cout << "serverFd: " << allFds.serverFd << std::endl;
while (alive)
{
//std::cout << "\n\n\nwhile alive event loop" << std::endl;
//std::cout << "in loop nbr user = " << allFds.nbrUser << std::endl;
eventNbr = epoll_wait(allFds.epollFd, allFds.events, MAX_EVENTS, 5000);
//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;
//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);
@ -39,11 +42,10 @@ void start_loop(fdList &allFds)
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;
}
}
}

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2022/12/06 21:44:20 by apommier #+# #+# */
/* Updated: 2023/02/10 09:18:45 by apommier ### ########.fr */
/* Updated: 2023/02/11 14:49:36 by apommier ### ########.fr */
/* */
/* ************************************************************************** */
@ -28,6 +28,9 @@ void initialize(char **av)
//int addrLen = sizeof(addr);
fdList allFds;
allFds.userData.reserve(MAX_EVENTS);
allFds.channelList.reserve(MAX_CHAN);
allFds.nbrUser = 0;
allFds.serverFd = socket(AF_INET, SOCK_STREAM, 0);
if (allFds.serverFd == -1)

View File

@ -6,7 +6,7 @@
/* By: apommier <apommier@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2022/12/06 21:46:41 by apommier #+# #+# */
/* Updated: 2022/12/07 01:09:12 by apommier ### ########.fr */
/* Updated: 2023/02/11 12:24:33 by apommier ### ########.fr */
/* */
/* ************************************************************************** */
@ -27,4 +27,47 @@ void close_fd(int fd)
{
if (close(fd))
ft_error("close() error");
}
void ft_putstr_fd(int fd, std::string str)
{
write(fd, str.c_str(), str.size());
write(fd, "\n", 1);
}
void cmd_error(fdList &allFds, int fd, std::string error)
{
(void)allFds; //to delete
write(fd, ":irc.local ", 11);
write(fd, error.c_str(), error.size());
}
// void find_user_in_chan(fdList &allFds, channelData *chan)
// {
// }
void del_user_in_chan(clientData *user, channelData *chan)
{
size_t i;
for (i = 0; user != chan->userList[i]; i++)
;
chan->userList.erase(chan->userList.begin() + i);
}
void delete_user(fdList &allFds, int userNbr)
{
std::cout << "Delete user nbr " << userNbr << std::endl;
// for (size_t i = 0; i < allFds.userData[userNbr].joinedChan.size(); i++)//all joined chan
// {
// del_user_in_chan(&allFds.userData[userNbr], allFds.userData[userNbr].joinedChan[i]);
// //allFds.userData[userNbr].joinedChan[i].erase(find_user_in_chan(allFds.userData[userNbr].joinedChan[i])/*find user in chan*/)
// }
close(allFds.userData[userNbr].fd);
allFds.userData.erase(allFds.userData.begin() + userNbr);
allFds.userList.erase(allFds.userList.begin() + userNbr);
allFds.nbrUser--;
}