From 9285dafe9947318efb7030e650980b93861dd78f Mon Sep 17 00:00:00 2001 From: Talyx Date: Tue, 11 Jan 2022 22:02:57 +0300 Subject: [PATCH] add eboll --- includes/Header.hpp | 1 + includes/Server.hpp | 16 +++++---- src/Header.cpp | 28 ++++++++++----- src/Server.cpp | 83 +++++++++++++++++++++++++++++++++++++++------ 4 files changed, 101 insertions(+), 27 deletions(-) diff --git a/includes/Header.hpp b/includes/Header.hpp index 4651993..65d1e1a 100644 --- a/includes/Header.hpp +++ b/includes/Header.hpp @@ -29,6 +29,7 @@ public: void identifyType(std::string); void printHeaderInfo(void); void parseRequest(void); + void clearHeader(void); Header(); Header(char *); ~Header(); diff --git a/includes/Server.hpp b/includes/Server.hpp index b8d5f14..0f5c3ac 100644 --- a/includes/Server.hpp +++ b/includes/Server.hpp @@ -3,7 +3,8 @@ #include "webserv.hpp" -#define BUFFSIZE 1024 +#define BUFFSIZE 1024 +#define MAX_CLIENT 1000 class Header; @@ -11,18 +12,19 @@ class Server { private: int _port; - int _serverSocket; - int _clientSocket; - // int _bufferSize; + int _epolfd; + int _client; + struct epoll_event _events[MAX_CLIENT]; struct sockaddr_in _addres; std::string _ip; private: void checkError(int fd, std::string str); void sendFile(std::string str); - void sendHeader(Header head); - void sendRespons(Header head); - + void sendHeader(Header head, int); + void sendRespons(Header head, int); + void setNonblocking(int fd); + void newConnection(int fd); public: Server(); Server(std::string path); diff --git a/src/Header.cpp b/src/Header.cpp index 2ce664b..7d7d0c5 100644 --- a/src/Header.cpp +++ b/src/Header.cpp @@ -81,6 +81,7 @@ void Header::parseRequest(void) if (_request.find(key) != _request.end()) { std::cout << RED << "ERROR: double header-field" << ZERO_C << std::endl; + std::cout << RED << (_request.find(key))->first << (_request.find(key))->second << std::endl; } else _request[key] = line; @@ -98,18 +99,27 @@ void Header::printHeaderInfo(void) std::cout << YELLOW << "request fileName = " << _fileName << ZERO_C << std::endl; std::cout << YELLOW << "request header:\n" << _buff << ZERO_C << std::endl; - // std::cout << TURGUOISE << "HEADER MAP" << ZERO_C << std::endl; - // for ( it = _request.begin(); it != _request.end(); it++) - // { - // std::cout << PINK << it->first << ZERO_C << std::endl; - // } - // for ( it = _request.begin(); it != _request.end(); it++) - // { - // std::cout << PINK << it->second << ZERO_C << std::endl; - // } + std::cout << TURGUOISE << "HEADER MAP" << ZERO_C << std::endl; + for ( it = _request.begin(); it != _request.end(); it++) + { + std::cout << PINK << it->first << ZERO_C << std::endl; + } + for ( it = _request.begin(); it != _request.end(); it++) + { + std::cout << PINK << it->second << ZERO_C << std::endl; + } } +void Header::clearHeader(void) +{ + _type = -1; + _row = 0; + _buff = NULL; + _fileName = "www/index2.html"; + _request.clear(); +} + Header::~Header() { } diff --git a/src/Server.cpp b/src/Server.cpp index 1404d2f..d114e46 100644 --- a/src/Server.cpp +++ b/src/Server.cpp @@ -2,28 +2,30 @@ //----------------------------------------------Constructors----------------------------------------------------------------------------------- Server::Server() { + _client = 0; } Server::Server(std::string path) { (void)path; + _client = 0; } //----------------------------------------------Send-------------------------------------------------------------------------------------------- -void Server::sendHeader(Header head) +void Server::sendHeader(Header head, int fd) { std::string tmp; const char *header; tmp = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n"; header = tmp.c_str(); std::cout << TURGUOISE << "Send Header\n" << YELLOW << tmp << ZERO_C; - send(_clientSocket, header, tmp.length(), 0); + send(fd, header, tmp.length(), 0); (void)head; } -void Server::sendRespons(Header head) +void Server::sendRespons(Header head, int fd) { std::string str = head.getFileName(); const char *path = str.c_str(); @@ -34,11 +36,11 @@ void Server::sendRespons(Header head) { file.open("www/index2.html"); } - sendHeader(head); + sendHeader(head, fd); while (!file.eof()) { file.read(buff, BUFFSIZE); - send(_clientSocket, buff, file.gcount(), 0); + send(fd, buff, file.gcount(), 0); } (void)path; } @@ -56,27 +58,86 @@ void Server::setupConfig(void) } +void Server::setNonblocking(int fd) +{ + fcntl(fd, F_SETFL, O_NONBLOCK); +} + +void Server::newConnection(int fd) +{ + struct epoll_event ev; + ev.events = EPOLLIN | EPOLLOUT | EPOLLET; + ev.data.fd = fd; + + epoll_ctl(_epolfd, EPOLL_CTL_ADD, fd, &ev); + _client++; +} + void Server::start(void) { Socket serverSocket(AF_INET, SOCK_STREAM, 0, _port); char buff[BUFFSIZE + 1] = {0}; Header header; + int fd_accept; - checkError(serverSocket.init(3), "Socket init"); - _clientSocket = accept(serverSocket.getSocketFd(), + checkError(serverSocket.init(MAX_CLIENT), "Socket init"); + fd_accept = accept(serverSocket.getSocketFd(), serverSocket.getSockaddr(), serverSocket.getSocklen()); - checkError(_clientSocket, "Initialize client socket"); - checkError(recv(_clientSocket, buff, BUFFSIZE, 0), "Receive msg from client"); + checkError(fd_accept, "Initialize client socket"); + checkError(recv(fd_accept, buff, BUFFSIZE, 0), "Receive msg from client"); std::cout << TURGUOISE << "Receive Header" << ZERO_C << std::endl; header.setRequest(buff); header.parseRequest(); header.printHeaderInfo(); - sendRespons(header); - close(_clientSocket); + sendRespons(header, fd_accept); + close(fd_accept); close(serverSocket.getSocketFd()); +//-----------------------------------------------попытка добавить epoll------------------ + // Socket serverSocket(AF_INET, SOCK_STREAM, 0, _port); + // char buff[BUFFSIZE + 1] = {0}; + // Header header[MAX_CLIENT]; + // int fd; + // int n; + // int nfds; + // int _clientSocket; + // nfds = 0; + // n = 0; + // _epolfd = epoll_create1(0); + // checkError(serverSocket.init(MAX_CLIENT), "Socket init"); + // setNonblocking(serverSocket.getSocketFd()); + // setNonblocking(_epolfd); + // while (true) + // { + // _clientSocket = accept(serverSocket.getSocketFd(), + // serverSocket.getSockaddr(), serverSocket.getSocklen()); + // if (_clientSocket > 0) + // newConnection(_clientSocket); + // if (_client > 0) + // nfds = epoll_wait(_epolfd, _events, MAX_CLIENT, -1); + // while (n < nfds) + // { + // fd = _events[n].data.fd; + // // std::cout << "n = " << n << " nfds = " << nfds << " fd = " << fd << " _clientSize = " << _client << " _clientSocket " << _clientSocket << std::endl; + // checkError(recv(fd, buff, BUFFSIZE, 0), "Receive msg from client"); + // header[fd].setRequest(buff); + // header[fd].parseRequest(); + // header[fd].printHeaderInfo(); + // sendRespons(header[fd], fd); + // header[fd].clearHeader(); + // close(fd); + // _client--; + // n++; + // } + // n = 0; + // nfds = 0; + // _clientSocket = 0; + // } + // close(serverSocket.getSocketFd()); } + + void Server::end(void) {