From 4bc54b29d773bbec523bf967c92e198e79c8b5a2 Mon Sep 17 00:00:00 2001 From: kinou-p Date: Tue, 7 Feb 2023 03:35:45 +0100 Subject: [PATCH] parsing start --- Makefile | 5 +- includes/ft_irc.hpp | 211 ++++++++++++++++++++++++++++++- srcs/client_request.cpp | 11 +- srcs/commands/nick.cpp | 18 +++ srcs/commands/parse_commands.cpp | 23 +++- srcs/commands/pass.cpp | 18 +++ srcs/commands/user.cpp | 18 +++ srcs/new_connection.cpp | 14 +- srcs/server_loop.cpp | 28 ++-- srcs/start_server.cpp | 9 +- tcpdump/Makefile | 31 +++++ tcpdump/launch_tcpdump.sh | 3 +- 12 files changed, 362 insertions(+), 27 deletions(-) create mode 100644 srcs/commands/nick.cpp create mode 100644 srcs/commands/pass.cpp create mode 100644 srcs/commands/user.cpp create mode 100644 tcpdump/Makefile diff --git a/Makefile b/Makefile index 9908d33..b33cc3a 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ # By: apommier +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2022/12/01 17:27:29 by apommier #+# #+# # -# Updated: 2022/12/09 23:21:35 by apommier ### ########.fr # +# Updated: 2022/12/20 23:31:36 by apommier ### ########.fr # # # # **************************************************************************** # @@ -17,7 +17,8 @@ SRCS := main.cpp\ utils.cpp\ client_request.cpp\ new_connection.cpp\ - server_loop.cpp + server_loop.cpp\ + commands/parse_commands.cpp CC = c++ FLAGS = -g diff --git a/includes/ft_irc.hpp b/includes/ft_irc.hpp index 831d680..2e1f580 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: 2022/12/09 23:18:30 by apommier ### ########.fr */ +/* Updated: 2023/02/06 15:10:08 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -23,15 +23,209 @@ #define MAX_EVENTS 5 #define READ_SIZE 10 +#define CMD_NBR 10 -struct fdList +//struct functionTab; +void ft_test(); + +/* ************************************************************************** */ +/* *********************************COMMANDS********************************* */ +/* ************************************************************************** */ + + std::string PASS(); + std::string NICK(); + std::string USER(); + std::string SERVER(); + std::string OPER(); + std::string QUIT(); + std::string SQUIT(); + std::string JOIN(); + std::string PART(); + std::string MODE(); + std::string TOPIC(); + std::string NAMES(); + std::string LIST(); + std::string INVITE(); + std::string KICK(); + std::string VERSION(); + std::string STATS(); + std::string LINKS(); + std::string TIME(); + std::string CONNECT(); + std::string TRACE(); + std::string ADMIN(); + std::string INFO(); + std::string PRIVMSG(); + std::string NOTICE(); + std::string WHO(); + std::string WHOIS(); + std::string WHOWAS(); + std::string KILL(); + std::string PING(); + std::string PONG(); + std::string ERROR(); + std::string AWAY(); + std::string REHASH(); + std::string RESTART(); + std::string SUMMON(); + std::string USER(); + std::string OPERWALL(); + std::string USERHOST(); + std::string ISON(); + + +/* ************************************************************************** */ +/* *****************************COMMAND STRUCT******************************* */ +/* ************************************************************************** */ + +struct functionTab +{ + static const int cmdNbr = 5; + std::string cmdName[cmdNbr] = + { + //4. Détails des messages + + //4.1 Etablissement de connexion + "PASS", + "NICK", + "USER", + "SERVER", + "OPER", + "QUIT", + "SQUIT", + + //4.2 Opérations sur les canaux + "JOIN", + "PART", + "MODE", + "TOPIC", + "NAMES", + "LIST", + "INVITE", + "KICK", + + //4.3 Requêtes et commandes des serveurs + "VERSION", + "STATS", + "LINKS", + "TIME", + "CONNECT", + "TRACE", + "ADMIN", + "INFO", + + //4.4 Envoi de messages + "PRIVMSG", + "NOTICE", + + //4.5 Requêtes basées sur les utilisateurs + + "WHO", + "WHOIS", + "WHOWAS", + //4.6 Messages divers + + "KILL", + "PING", + "PONG", + "ERROR", + + //5. Messages optionnels + "AWAY", + "REHASH", + "RESTART", + "SUMMON", + "USER", + "OPERWALL", + "USERHOST", + "ISON" + }; + + + void (*cmdPtr[cmdNbr])(void) = + { + //4. Détails des messages + + //4.1 Etablissement de connexion + PASS, + NICK, + USER, + SERVER, + OPER, + QUIT, + SQUIT, + + //4.2 Opérations sur les canaux + JOIN, + PART, + MODE, + TOPIC, + NAMES, + LIST, + INVITE, + KICK, + + //4.3 Requêtes et commandes des serveurs + VERSION, + STATS, + LINKS, + TIME, + CONNECT, + TRACE, + ADMIN, + INFO, + + //4.4 Envoi de messages + PRIVMSG, + NOTICE, + + //4.5 Requêtes basées sur les utilisateurs + + WHO, + WHOIS, + WHOWAS, + //4.6 Messages divers + + KILL, + PING, + PONG, + ERROR, + + //5. Messages optionnels + AWAY, + REHASH, + RESTART, + SUMMON, + USER, + OPERWALL, + USERHOST, + ISON + }; +}; + +/* ************************************************************************** */ +/* *********************************STRUCT*********************************** */ +/* ************************************************************************** */ + +struct fdList //allFds in code { int epollFd; int serverFd; int userList[MAX_EVENTS]; int nbrUser; + functionTab parsingTab; }; +struct userClient +{ + // int epollFd; + // int serverFd; + // int userList[MAX_EVENTS]; + // int nbrUser; +}; + + + /* ************************************************************************** */ /* *********************************UTILS************************************ */ /* ************************************************************************** */ @@ -54,8 +248,15 @@ void epoll_add(int epollFd, int fd); int epoll_start(); //2nd /* ************************************************************************** */ -/* *****************************EPOLL UTILITY******************************** */ +/* *************************CONNECTION AND REQUEST*************************** */ /* ************************************************************************** */ -void new_connection(struct epoll_event newClient); -bool clientRequest(fdList allFds, int newFd); \ No newline at end of file +void new_connection(fdList allFds, struct epoll_event newClient); +bool clientRequest(fdList allFds, int newFd); + +/* ************************************************************************** */ +/* ***************************COMMANDS PARSING******************************* */ +/* ************************************************************************** */ + +void parse_commands(std::string buffer, fdList allFds); + diff --git a/srcs/client_request.cpp b/srcs/client_request.cpp index d87d81e..b684145 100644 --- a/srcs/client_request.cpp +++ b/srcs/client_request.cpp @@ -6,14 +6,21 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/12/09 22:34:36 by apommier #+# #+# */ -/* Updated: 2022/12/09 23:18:46 by apommier ### ########.fr */ +/* Updated: 2023/02/06 12:36:52 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ #include "../includes/ft_irc.hpp" -bool clientRequest(fdList allFds, int newFd) +bool clientRequest(fdList allFds, int clientFd) { + char buf[1024] = {0}; + size_t len = 1024; + std::cout << "client request!" << std::endl; + if (recv(clientFd, buf, len, 0) == -1) + ft_error("recv() error"); + std::cout << "BUFFER: ---" << buf << "---" << std::endl; + parse_commands(buf, allFds); return (1); } \ No newline at end of file diff --git a/srcs/commands/nick.cpp b/srcs/commands/nick.cpp new file mode 100644 index 0000000..f26d476 --- /dev/null +++ b/srcs/commands/nick.cpp @@ -0,0 +1,18 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* nick.cpp :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: apommier +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2023/02/06 14:28:38 by apommier #+# #+# */ +/* Updated: 2023/02/06 14:28:55 by apommier ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "../../includes/ft_irc.hpp" + +void NICK() +{ + +} \ No newline at end of file diff --git a/srcs/commands/parse_commands.cpp b/srcs/commands/parse_commands.cpp index 1f7f96d..a53515f 100644 --- a/srcs/commands/parse_commands.cpp +++ b/srcs/commands/parse_commands.cpp @@ -6,7 +6,28 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/12/06 22:01:25 by apommier #+# #+# */ -/* Updated: 2022/12/06 22:01:26 by apommier ### ########.fr */ +/* Updated: 2023/02/06 12:39:13 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ +#include "../../includes/ft_irc.hpp" + +void ft_test() +{ + std::cout << "hehe je suis la" << std::endl; +} + +void parse_commands(std::string buffer, fdList allFds) +{ + std::string cmd = buffer; + int a = 0; + + cmd.pop_back(); + std::cout << "BUFFER In PARSING: ---" << cmd << "---" << std::endl; + while (cmd != allFds.parsingTab.cmdName[a] && a < allFds.parsingTab.cmdNbr) + a++; + if (a == allFds.parsingTab.cmdNbr) + std::cout << "Command not found\n"; + else + allFds.parsingTab.cmdPtr[a](); +} \ No newline at end of file diff --git a/srcs/commands/pass.cpp b/srcs/commands/pass.cpp new file mode 100644 index 0000000..ef39ce0 --- /dev/null +++ b/srcs/commands/pass.cpp @@ -0,0 +1,18 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* pass.cpp :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: apommier +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2023/02/06 14:40:42 by apommier #+# #+# */ +/* Updated: 2023/02/06 14:41:12 by apommier ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "../../includes/ft_irc.hpp" + +void PASS() +{ + +} \ No newline at end of file diff --git a/srcs/commands/user.cpp b/srcs/commands/user.cpp new file mode 100644 index 0000000..81f7085 --- /dev/null +++ b/srcs/commands/user.cpp @@ -0,0 +1,18 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* user.cpp :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: apommier +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2023/02/06 14:40:39 by apommier #+# #+# */ +/* Updated: 2023/02/06 14:41:03 by apommier ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "../../includes/ft_irc.hpp" + +void USER() +{ + +} \ No newline at end of file diff --git a/srcs/new_connection.cpp b/srcs/new_connection.cpp index 227345a..3879fa2 100644 --- a/srcs/new_connection.cpp +++ b/srcs/new_connection.cpp @@ -6,13 +6,21 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/12/09 22:26:27 by apommier #+# #+# */ -/* Updated: 2022/12/09 22:38:40 by apommier ### ########.fr */ +/* Updated: 2022/12/18 12:13:28 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ #include "../includes/ft_irc.hpp" -void new_connection(struct epoll_event newClient) +void new_connection(fdList allFds, struct epoll_event newClient) { - std::cout << "new connection !" << std::endl; + 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); + 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 832194b..e28cac1 100644 --- a/srcs/server_loop.cpp +++ b/srcs/server_loop.cpp @@ -6,7 +6,7 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/12/06 21:58:13 by apommier #+# #+# */ -/* Updated: 2022/12/09 23:56:24 by apommier ### ########.fr */ +/* Updated: 2023/02/06 12:33:21 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ @@ -20,30 +20,36 @@ void start_loop(fdList allFds) int readChar; int eventNbr; + std::cout << "serverFd: " << allFds.serverFd << std::endl; 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'; - std::cout << "serverFd: " << allFds.serverFd << std::endl; + // send(clientFd, "message received", 18, 0); eventNbr = epoll_wait(allFds.epollFd, events, MAX_EVENTS, 5000); std::cout << "eventNbr: " << eventNbr << std::endl; - for (int i = 0; i < eventNbr; i++) + for (int i = 0; i < eventNbr ; i++) { std::cout << "event[i]'s fd: " << events[i].data.fd << std::endl; if (events[i].data.fd == allFds.serverFd) - new_connection(events[i]); + new_connection(allFds, events[i]); else if (!clientRequest(allFds, events[i].data.fd)) - alive = false; - //if (strncmp("QUIT", buffer, 4)) - // alive = 0; + { + alive = false; + //else + // std::cout << "F*CK i dont know" << std::endl; + //if (strncmp("QUIT", buffer, 4)) + // alive = 0; + } } + if (!strncmp("/quit", buffer, 5)) + std::cout << "quit message received\n"; + } - if (!strncmp("/quit", buffer, 5)) - { - std::cout << "quit message received\n"; - } + std::cout << "dead server\n"; + } \ No newline at end of file diff --git a/srcs/start_server.cpp b/srcs/start_server.cpp index dcc2788..cf83f4d 100644 --- a/srcs/start_server.cpp +++ b/srcs/start_server.cpp @@ -6,12 +6,18 @@ /* By: apommier +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/12/06 21:44:20 by apommier #+# #+# */ -/* Updated: 2022/12/09 23:57:24 by apommier ### ########.fr */ +/* Updated: 2023/02/06 12:32:07 by apommier ### ########.fr */ /* */ /* ************************************************************************** */ #include "../includes/ft_irc.hpp" +// void initialize_function_ptr(fdList allFds) +// { +// // int i = 0; +// // for (i = 0; i < allFds.parsingTab.cmdNbr, i++) +// } + void initialize(char **av) { //int allFds.serverFd; @@ -22,6 +28,7 @@ void initialize(char **av) int addrLen = sizeof(addr); fdList allFds; + allFds.nbrUser = 0; allFds.serverFd = socket(AF_INET, SOCK_STREAM, 0); if (allFds.serverFd == -1) ft_error("socket() error"); diff --git a/tcpdump/Makefile b/tcpdump/Makefile new file mode 100644 index 0000000..1989777 --- /dev/null +++ b/tcpdump/Makefile @@ -0,0 +1,31 @@ +# **************************************************************************** # +# # +# ::: :::::::: # +# Makefile :+: :+: :+: # +# +:+ +:+ +:+ # +# By: apommier +#+ +:+ +#+ # +# +#+#+#+#+#+ +#+ # +# Created: 2022/08/12 01:38:24 by apommier #+# #+# # +# Updated: 2022/12/16 01:47:58 by apommier ### ########.fr # +# # +# **************************************************************************** # + +all: + bash launch_tcpdump.sh +# docker-compose -f ./srcs/docker-compose.yml up --build + +fclean: + -docker rm $$(docker ps -qa) + -docker rmi -f $$(docker images -qa) + -docker volume rm $$(docker volume ls -q) + -docker network rm $$(docker network ls -q) +# up: +# docker-compose -f ./srcs/docker-compose.yml up + +# back: +# docker-compose -f ./srcs/docker-compose.yml up --build -d + +# down: +# docker-compose -f ./srcs/docker-compose.yml down + +re: fclean all \ No newline at end of file diff --git a/tcpdump/launch_tcpdump.sh b/tcpdump/launch_tcpdump.sh index 6d403d6..a5d24af 100644 --- a/tcpdump/launch_tcpdump.sh +++ b/tcpdump/launch_tcpdump.sh @@ -7,5 +7,4 @@ docker build ./ -t $IMAGE_NAME docker images docker ps -a docker run -d -p 6667:6667 --name $CONTAINER_NAME $IMAGE_NAME -docker exec -it $CONTAINER_NAME tcpdump -Aqq port 6667 - +docker exec -it $CONTAINER_NAME tcpdump -Aqq port 6667 \ No newline at end of file