diff --git a/Makefile b/Makefile index e47562a..e7e4a18 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ SANFLAGS = -fsanitize=address # SANFLAGS = -fsanitize=leak -CXXFLAGS = -Wall -Wextra -Werror -g -std=c++98 $(SANFLAGS) +CXXFLAGS = -Wall -Wextra -Werror -g -std=c++98 $(SANFLAGS) CPPFLAGS += -MD -MP diff --git a/src/Client/Client.cpp b/src/Client/Client.cpp index 3bf095a..e928ea0 100644 --- a/src/Client/Client.cpp +++ b/src/Client/Client.cpp @@ -57,7 +57,6 @@ void Client::setFd(int fd) this->_fd = fd; } - //-------------------------------------------------Parsing--------------------------------------- int Client::parseRequest(void) diff --git a/src/Server/Server.cpp b/src/Server/Server.cpp index 5a639b0..2bdf729 100644 --- a/src/Server/Server.cpp +++ b/src/Server/Server.cpp @@ -56,81 +56,75 @@ void Server::setNonBlock(int fd) fcntl(fd, F_SETFL, O_NONBLOCK); } -void Server::add_to_epoll_list(int fd) +void Server::add_to_epoll_list(int fd, unsigned int ep_events) { struct epoll_event ev; - ev.events = EPOLLIN | EPOLLOUT | EPOLLET; + ev.events = ep_events; ev.data.fd = fd; - epoll_ctl(_epoll_fd, EPOLL_CTL_ADD, fd, &ev); + assert(epoll_ctl(_epoll_fd, EPOLL_CTL_ADD, fd, &ev) == 0); _client++; - std::cerr << RED - << "add client_sock " + std::cerr << YELLO + << "add socket " << fd << " to epoll_list" << RESET << std::endl; } -/* void Server::add_to_epoll_list(int fd, unsigned int ep_events) */ -/* { */ -/* struct epoll_event event; */ -/* event.data.fd = fd; */ -/* event.events = ep_events; */ -/* if (epoll_ctl(_epoll_fd, EPOLL_CTL_ADD, fd, &event)) */ -/* throw std::logic_error("epoll add"); */ - -/* } */ - void Server::start(void) { Socket server_sock(AF_INET, SOCK_STREAM, 0, _port, "127.0.0.1"); - char buf[BUFFSIZE + 1] = {0}; - /* Client Client[MAX_CLIENT]; */ - std::map Client_map; + char buf[BUFFSIZE] = {0}; + std::map client_map; int fd; - int client_sock; - /* int status; */ + int status; int ready_num = 0; - /* struct epoll_event ev; */ - - /* unsigned int ep_events = EPOLLIN | EPOLLOUT | EPOLLET; */ + unsigned int client_events = EPOLLIN | EPOLLOUT | EPOLLET; + unsigned int server_events = EPOLLIN | EPOLLOUT | EPOLLET; - _epoll_fd = epoll_create1(0); + _epoll_fd = epoll_create(1337); checkError(server_sock.init(MAX_CLIENT), "Socket init"); setNonBlock(server_sock.getSocketFd()); setNonBlock(_epoll_fd); + + std::cerr << YELLO << "adding server_sock..." << RESET << std::endl; + add_to_epoll_list(server_sock.getSocketFd(), server_events); while (1) { - client_sock = accept(server_sock.getSocketFd(), - server_sock.getSockaddr(), server_sock.getSocklen()); - if (client_sock > 0) - add_to_epoll_list(client_sock); - if (_client > 0) - ready_num = epoll_wait(_epoll_fd, _events, MAX_CLIENT, -1); - /* std::cout << GREEN << "after epoll_wait" << RESET << std::endl; */ + ready_num = epoll_wait(_epoll_fd, _events, MAX_CLIENT, -1); if (ready_num < 0) - { - perror("epoll_ret"); throw std::logic_error("epoll_ret"); - } for (int i = 0; i < ready_num; i++) { /* if (_events[i].events == 0) */ /* continue; */ - - std::cout << TURQ << "IN FOR LOOP" << RESET << std::endl; fd = _events[i].data.fd; - assert(recv(fd, buf, BUFFSIZE, 0) >= 0); - Client_map[fd].setRawData(buf); - Client_map[fd].parseRequest(); - Client_map[fd].printClientInfo(); - Client_map[fd].sendResponse(fd); - Client_map[fd].clear(); - /* std::cout << BLUE << "status is " << Client_map[fd].getReasonPhrase(status) << RESET << std::endl; */ - bzero(buf, BUFFSIZE); - close(fd); - _client--; + + if (fd == server_sock.getSocketFd()) + { + int client_sock = accept(server_sock.getSocketFd(), + server_sock.getSockaddr(), server_sock.getSocklen()); + if (client_sock > 0) + add_to_epoll_list(client_sock, client_events); + else + throw std::logic_error("accept didnt work"); + } + else + { + std::cout << TURQ << "IN FOR LOOP" << RESET << std::endl; + assert(recv(fd, buf, BUFFSIZE, 0) >= 0); + client_map[fd].setRawData(buf); + status = client_map[fd].parseRequest(); + client_map[fd].printClientInfo(); + client_map[fd].sendResponse(fd); + client_map[fd].clear(); + client_map.erase(fd); + std::cout << BLUE << "status is " << Response::getReasonPhrase(status) << RESET << std::endl; + bzero(buf, BUFFSIZE); + close(fd); + _client--; + } } ready_num = 0; diff --git a/src/Server/Server.hpp b/src/Server/Server.hpp index ece1237..b88f6a5 100644 --- a/src/Server/Server.hpp +++ b/src/Server/Server.hpp @@ -19,7 +19,7 @@ private: struct sockaddr_in _addres; std::string _ip; std::vector _configs; - /* void add_to_epoll_list(int fd, unsigned int ep_events); */ + void add_to_epoll_list(int fd, unsigned int ep_events); private: void checkError(int fd, std::string str); @@ -27,7 +27,6 @@ private: void sendClient(Client head, int); void sendResponse(Client head, int); void setNonBlock(int fd); - void add_to_epoll_list(int fd); public: Server(); Server(std::string path);