From fecf5411bcc0d283a15049c8e599fc4fdf75a3af Mon Sep 17 00:00:00 2001 From: hugogogo Date: Wed, 20 Jul 2022 14:34:16 +0200 Subject: [PATCH] separate main tests in differents files and added comparison in readme --- Makefile | 41 +++++- README.md | 85 +++++++++++- srcs/Webserv.cpp | 36 ++--- srcs/main.cpp | 151 ++++++--------------- srcs/main_1.cpp | 163 +++++++++++++++++++++++ srcs/main_hugo.cpp | 163 +++++++++++++++++++++++ srcs/main_luke.cpp | 25 ++++ srcs/main_poll.cpp | 308 +++++++++++++++++++++++++++++++++++++++++++ srcs/main_select.cpp | 303 ++++++++++++++++++++++++++++++++++++++++++ webserv | Bin 125792 -> 123032 bytes 10 files changed, 1145 insertions(+), 130 deletions(-) create mode 100644 srcs/main_1.cpp create mode 100644 srcs/main_hugo.cpp create mode 100644 srcs/main_luke.cpp create mode 100644 srcs/main_poll.cpp create mode 100644 srcs/main_select.cpp diff --git a/Makefile b/Makefile index 17f51b6..eb7dd60 100644 --- a/Makefile +++ b/Makefile @@ -1,3 +1,30 @@ + +## VARIABLES +#NAME = my_program +#VPATH = srcs +#CXX = c++ +#CXXFLAGS = -I ./srcs +#OBJS = $(SRCS:%.cpp=%.o) +# +#MAIN = main.cpp +#SRCS = $(MAIN) Webserv.cpp +# +## RULES +#all: $(NAME) +# +#hugo: MAIN = main_hugo.cpp +#hugo: re +# +#$(NAME) : $(OBJS) +# $(CXX) $(OBJS) -o $(NAME) +#clean: +# rm -f $(OBJS) +#fclean: clean +# rm -f $(NAME) +#re: fclean all +#.PHONY : all clean fclean re + + NAME = webserv CXX = c++ @@ -10,14 +37,19 @@ CXXFLAGS += -g #SHELL = /bin/zsh VPATH = $(DIR_SRCS) -DIR_SRCS = srcs +DIR_SRCS = srcs HEADERS_D = ./srcs HEADERS = Webserv.hpp -DEPENDENCIES = $(HEADERS:%=$(HEADERS_D)/%) +DEPENDENCIES = $(HEADERS:%=$(HEADERS_D)/%) -SRCS = main.cpp Webserv.cpp +SRCS = $(MAIN) Webserv.cpp +#MAIN = main.cpp +#MAIN = main_luke.cpp +#MAIN = main_hugo.cpp +#MAIN = main_poll.cpp +MAIN = main_select.cpp DIR_OBJS = builds OBJS = $(SRCS:%.cpp=$(DIR_OBJS)/%.o) @@ -27,6 +59,8 @@ OBJS = $(SRCS:%.cpp=$(DIR_OBJS)/%.o) # -------------------- all: $(NAME) +luke: Webserv.cpp main_luke.cpp +luke: re $(DIR_OBJS)/%.o: %.cpp | $(DIR_OBJS) $(CXX) $(CXXFLAGS) -c $< -o $@ @@ -51,3 +85,4 @@ re: fclean all #run: all .PHONY : all clean fclean re run + diff --git a/README.md b/README.md index 542445d..7e55273 100644 --- a/README.md +++ b/README.md @@ -9,8 +9,8 @@ - **socket :** creates an endpoint for communication and returns a file descriptor that refers to that endpoint - **listen :** marks a socket as a passive socket, that is, as a socket that will be used to accept incoming connection requests using accept() - **accept :** used with connection-based socket types. It extracts the first connection request on the queue of pending connections for the listening socket, creates a new connected socket, and returns a new file descriptor referring to that socket. The newly created socket is not in the listening state. The original socket is unaffected by this call -- **send :** used to transmit a message to another socket. May be used only when the socket is in a connected state (so that the intended recipient is known). The only difference between send() and write() is the presence of flags. With a zero flags argument, send() is equivalent to write() -- **recv :** used to receive messages from a socket. May be used to receive data on both connectionless and connection-oriented sockets. The only difference between recv() and read() is the presence of flags. With a zero flags argument, recv() is generally equivalent to read() +- **send :** (~write) used to transmit a message to another socket. May be used only when the socket is in a connected state (so that the intended recipient is known). The only difference between send() and write() is the presence of flags. With a zero flags argument, send() is equivalent to write() +- **recv :** (~read) used to receive messages from a socket. May be used to receive data on both connectionless and connection-oriented sockets. The only difference between recv() and read() is the presence of flags. With a zero flags argument, recv() is generally equivalent to read() - **bind :** associate a socket fd to a local address. When a socket is created with socket(), it exists in a name space (address family) but has no address assigned to it. It is normally necessary to assign a local address using bind() before a socket may receive connections (see accept()) - **connect :** connects a socket fd to a remote address - **inet_addr :** converts the Internet host address cp from IPv4 numbers-and-dots notation into binary data in network byte order. Use of this function is problematic because in case of error it returns -1, wich is a valid address (255.255.255.255). Avoid its use in favor of inet_aton(), inet_pton(), or getaddrinfo() @@ -77,3 +77,84 @@ - [bind() vs connect()](https://stackoverflow.com/questions/27014955/socket-connect-vs-bind) - [INADDR_ANY for bind](https://stackoverflow.com/questions/16508685/understanding-inaddr-any-for-socket-programming) +## code architecture + + +``` + ______ + sd = SOCKET() : create a listening socket descriptor + __________ + SETSOCKOPT(sd) : allow socket descriptor to be reuseable + _____ + IOCTL(sd) : set listening socket and all incoming socket to be non-blocking + ____ + BIND(port) : associate listening socket to a port + ______ + LISTEN(nb_queue) : queue the incoming connections to listening socket + up to a chosen number + ____ + POLL(fds[]) : wait for event on files descriptors + ______ + SELECT(fds[]) : wait for event on files descriptors + FD_SET() : add a fd to a set + FD_CLR() : remove a fd from a set + FD_ZERO() : clears a set + FD_ISSET() : test to see if a fd is part of the set + ______ + new_sd = ACCEPT() : extract first connection request in queue of listening socket + and creates a new socket that is connected + ____ + RECV(new_sd) : read data in socket created by accept() + ____ + SEND(new_sd) : write data in socket created by accept() + _____ + CLOSE(new_sd) : close open file (here socket) descriptor + +``` + +compare architectures : + +``` + POLL SELECT + ______ ______ ______ + lstn_sd = SOCKET() | lstn_sd = SOCKET() | lstn_sd = SOCKET() + | __________ | __________ + | SETSOCKOPT() | SETSOCKOPT() + | _____ | _____ + | IOCTL() | IOCTL() + ____ | ____ | ____ + BIND(port) | BIND(port) | BIND(port) + ______ | ______ | ______ + LISTEN(nb_queue) | LISTEN(nb_queue) | LISTEN(nb_queue) + | | + | fds[1] = lstn_sd | FD_SET(lstn_fd) + | | + | | max_sd = lstn_sd + | | + loop | loop | loop + . ____ | . ____ | . ______ + . POLL() | . POLL(fds[]) | . SELECT(fds[]) + . | . | . + . | . loop through fds[] | . loop i++ < max_fd + . | . . | . . + . | . . POLLIN && lstn_sd ? | . . FD_ISSET(i) & lstn_fd ? + . ______ | . . . ______ | . . . ______ + . ACCEPT() | . . . new_sd = ACCEPT() | . . . new_sd = ACCEPT() + . | . . . | . . . + . | . . . fds[] += new_sd | . . . FD_SET new_sd in fds[] + . | . . | . . . + . | . . | . . . max_sd = new_sd + . | . . | . . + . | . . POLLIN ? | . . FD_ISSET ? + . ____ | . . . ____ | . . . ____ + . RECV() | . . . RECV() | . . . RECV() + . ____ | . . . ____ | . . . ____ + . SEND() | . . . SEND() | . . . SEND() + . | | + . | loop through fds[] | loop through fds[] + . _____ | . _____ | . _____ + . CLOSE(fds[]) | . CLOSE(fds[]) | . CLOSE(fds[]) + + +``` + diff --git a/srcs/Webserv.cpp b/srcs/Webserv.cpp index a4f426d..9055390 100644 --- a/srcs/Webserv.cpp +++ b/srcs/Webserv.cpp @@ -4,7 +4,8 @@ Webserv::Webserv() { std::cout << "Server init\n"; - _socket_fd = ::socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0); + // _socket_fd = ::socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0); + _socket_fd = ::socket(AF_INET, SOCK_STREAM, 0); if (_socket_fd == -1) { ::perror("err socket(): "); @@ -12,11 +13,21 @@ Webserv::Webserv() } } +/* Webserv::Webserv(Webserv const &src) +{ + +} */ + Webserv::~Webserv() { std::cout << "Server destroyed\n"; } +/* Webserv & Webserv::operator=(Webserv const &rhs) +{ + +} */ + /////////////// // Functions // @@ -56,36 +67,31 @@ void Webserv::start() struct sockaddr_in addr; socklen_t addr_len; int accepted_fd; - - // poll (or equivalent) - struct pollfd poll_s; - poll_s.fd = _socket_fd; - poll_s.events = POLLIN; - - char buf[BUFSIZE]; // WIP buffer. need to try with std::vector or std::string. - int ret; + struct pollfd poll_s; + char buf[BUFSIZE]; // WIP buffer. need to try with std::vector or std::string. + int ret; std::cout << "Server started\n"; while (1) { std::cout << "----------\n"; - std::cout << "poll()\n"; // poll (or equivalent) - ::poll(&poll_s, 1, -1); - + std::cout << "accept()\n"; addr_len = sizeof addr; accepted_fd = ::accept(_socket_fd, (sockaddr*)&addr, &addr_len); if (accepted_fd == -1) { ::perror("err accept(): "); - //throw WebservError(); continue; } - std::cout << "accept()\n"; - // "Your server must never block and the client can be bounced properly if necessary". // NO-Block OK, but how to handle it ? Miss the bouncing part. ::fcntl(accepted_fd, F_SETFL, O_NONBLOCK); + std::cout << "poll()\n"; // poll (or equivalent) + poll_s.fd = accepted_fd; + poll_s.events = POLLIN; // We need a way to valid POLLOUT and POLLIN at the same time (both, not one of them) + ::poll(&poll_s, 1, -1); + std::cout << "recv()\n"; ret = ::recv(accepted_fd, buf, BUFSIZE, 0); if (ret == -1) diff --git a/srcs/main.cpp b/srcs/main.cpp index caea669..fd4391b 100644 --- a/srcs/main.cpp +++ b/srcs/main.cpp @@ -1,7 +1,4 @@ -/* - luke version - #include #include #include @@ -13,8 +10,8 @@ int main(void) { Webserv serv; - // https://security.stackexchange.com/questions/169213/how-to-chose-a-port-to-run-an-application-on-localhost - serv.bind(8080); + // https://security.stackexchange.com/questions/169213/how-to-chose-a-port-to-run-an-application-on-localhost + serv.bind(4040); serv.listen(512); // 512 max connections arbitrary serv.start(); } @@ -24,112 +21,46 @@ int main(void) } return (0); } -*/ - /* - wip hugo version + + + ______ + listen_fd = SOCKET() : create a listening socket + __________ + SETSOCKOPT() : Allow socket descriptor to be reuseable + _____ + IOCTL() : set listen_fd and all incoming socket to be non-blocking + ____ + BIND(port) : associate listen_fd to a port + ______ + LISTEN(nb_queue) : queue the incoming connections to listen_fd, up to a chosen number + + fds[1] = listen_fd + + loop + . ____ + . POLL(fds[]) : + . + . loop through fds[] + . . + . . POLLIN && listen_fd ? : readable socket and this is the listening one + . . . ______ + . . . new_fd = ACCEPT() : extract first connection request in queue of listen_fd + . . . and creates a new socket that is connected + . . . + . . . fds[] += new_fd + . . + . . POLLIN ? : readable socket and this is an active one + . . . ____ + . . . RECV() : read data in socket created by accept() + . . . ____ + . . . SEND() : write data in socket created by accept() + + loop through fds[] : + . _____ + . CLOSE(fds[]) + + */ - # include - # include - # include - # include // fcntl - -# include // close -# include // exit -# include // cout, cin -# include // errno -# include // perror -# include // memset -# include // socket, accept, listen, send, recv, bind, connect, setsockopt, getsockname -# include // sockaddr_in -# include // inet_ntoa, inet_addr, htonl, htons, ntohl, ntohs -# include // poll - -# define INVALID -1 -# define BACKLOG 20 -// test with curl http://localhost:PORT (replace PORT by the port number you choose below) -# define PORT 4040 - -int main() -{ - struct sockaddr_in my_addr; - struct sockaddr_in their_addr; - int sckt_fd; - int axpt_fd; - int lstn; - socklen_t addr_len; - - // INIT SOCKET - sckt_fd = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0); - if (sckt_fd == INVALID) - { - perror("err socket(): "); - return 0; - } - std::cout << "server init\n"; - - // BIND IT - memset(&my_addr, 0, sizeof(my_addr)); - my_addr.sin_family = AF_INET; - my_addr.sin_port = htons(PORT); - my_addr.sin_addr.s_addr = htonl(INADDR_ANY); - // my_addr.sin_addr.s_addr = inet_addr("10.12.110.57"); - bind(sckt_fd, (struct sockaddr *)&my_addr, sizeof(my_addr)); - if (sckt_fd == INVALID) - { - perror("err bind(): "); - return 0; - } - std::cout << "socket bind to port: " << PORT << "\n"; - // https://beej.us/guide/bgnet/html/index-wide.html#cb29 : - // - // Sometimes, you might notice, you try to rerun a server and bind() fails, claiming “Address already in use.” What does that mean? Well, a little bit of a socket that was connected is still hanging around in the kernel, and it’s hogging the port. You can either wait for it to clear (a minute or so), or add code to your program allowing it to reuse the port, like this: - // - // int yes=1; - // - // // lose the pesky "Address already in use" error message - // if (setsockopt(listener,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof yes) == -1) { - // perror("setsockopt"); - // exit(1); - // } - - // LISTEN ON IT - lstn = listen(sckt_fd, BACKLOG); - if (lstn == INVALID) - { - perror("err listen(): "); - return 0; - } - std::cout << "server listening\n"; - - // ACCEPT INCOMING CONNECT - while (1) - { - - addr_len = sizeof(their_addr); - axpt_fd = accept(sckt_fd, (sockaddr*)&their_addr, &addr_len); - if (axpt_fd == INVALID) - { - perror("err accept(): "); - continue; - } - std::cout << "server accepted a socket from: " - << inet_ntoa(their_addr.sin_addr) - << "\n"; - - // // with a fork - // if (!fork()) // child process - // { - // close(sckt_fd); // child doesn't need the listener - // if (send(axpt_fd, "hello world !", 13, 0) == INVALID) - // perror("err send(): "); - // close(axpt_fd); - // exit(0); - // } - // close(axpt_fd); // parent doesn't need this - } - - return 0; -} diff --git a/srcs/main_1.cpp b/srcs/main_1.cpp new file mode 100644 index 0000000..ec98b84 --- /dev/null +++ b/srcs/main_1.cpp @@ -0,0 +1,163 @@ + +# include // close +# include // exit +# include // cout, cin +# include // errno +# include // perror +# include // memset +# include // socket, accept, listen, send, recv, bind, connect, setsockopt, getsockname +# include // sockaddr_in +# include // inet_ntoa, inet_addr, htonl, htons, ntohl, ntohs +# include // poll +# include // fcntl + +# define INVALID -1 +# define BACKLOG 20 +// test with curl http://localhost:PORT (replace PORT by the port number you choose below) +# define PORT 4040 +# define BUFSIZE 8192 +# define MSG_TEST "Le Webserv / 20 =D\n" +# define MSG_BOUNCE "bounced properly ;)\n" + +int main() +{ + struct sockaddr_in my_addr, their_addr; + int sckt_fd, axpt_fd, lstn, ret; + socklen_t addr_len; + struct pollfd poll_s; + char buf[BUFSIZE]; + + + // --------------------------------------------------------------------------- // + // SOCKET // + // // + // --------------------------------------------------------------------------- // + sckt_fd = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0); + if (sckt_fd == INVALID) + { + perror("err socket()"); + return 0; + } + std::cout << "server init\n"; + + + // --------------------------------------------------------------------------- // + // BIND // + // // + // --------------------------------------------------------------------------- // + memset(&my_addr, 0, sizeof(my_addr)); + my_addr.sin_family = AF_INET; + my_addr.sin_port = htons(PORT); + my_addr.sin_addr.s_addr = htonl(INADDR_ANY); + // my_addr.sin_addr.s_addr = inet_addr("10.12.110.57"); + bind(sckt_fd, (struct sockaddr *)&my_addr, sizeof(my_addr)); + if (sckt_fd == INVALID) + { + perror("err bind()"); + return 0; + } + std::cout << "socket bind to port: " << PORT << "\n"; + // https://beej.us/guide/bgnet/html/index-wide.html#cb29 : + // + // Sometimes, you might notice, you try to rerun a server and bind() fails, claiming “Address already in use.” What does that mean? Well, a little bit of a socket that was connected is still hanging around in the kernel, and it’s hogging the port. You can either wait for it to clear (a minute or so), or add code to your program allowing it to reuse the port, like this: + // + // int yes=1; + // + // // lose the pesky "Address already in use" error message + // if (setsockopt(listener,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof yes) == -1) { + // perror("setsockopt"); + // exit(1); + // } + + + // --------------------------------------------------------------------------- // + // LISTEN // + // mark the socket as passive, to receive incoming connection requests // + // --------------------------------------------------------------------------- // + lstn = listen(sckt_fd, BACKLOG); + if (lstn == INVALID) + { + perror("err listen()"); + return 0; + } + std::cout << "server listening\n"; + + while (1) + { + + // ----------------------------------------------------------------------- // + // ACCEPT // + // extract first connection request in the queue of the listening socket // + // and creates a new socket that is connected, and returns it // + // ----------------------------------------------------------------------- // + addr_len = sizeof(their_addr); + axpt_fd = accept(sckt_fd, (sockaddr*)&their_addr, &addr_len); + if (axpt_fd == INVALID) + { + perror("err accept()"); + continue; + } + std::cout << "server accepted a socket from: " + << inet_ntoa(their_addr.sin_addr) + << "\n"; + + + ///////////////////// + // luke version + ///////////////////// + + + // ----------------------------------------------------------------------- // + // FCNTL // + // manipulate the new socket fd to mark it as non-blocking // + // ----------------------------------------------------------------------- // + fcntl(axpt_fd, F_SETFL, O_NONBLOCK); + + + // ----------------------------------------------------------------------- // + // POLL // + // waits for an event on the axpt_fd : there is data to read // + // ----------------------------------------------------------------------- // + poll_s.fd = axpt_fd; + poll_s.events = POLLIN; // We need a way to valid POLLOUT and POLLIN at the same time (both, not one of them) + poll(&poll_s, 1, -1); + std::cout << "poll()\n"; + + + // ----------------------------------------------------------------------- // + // RECV // + // act as read, read the data of the socket created by accept() // + // ----------------------------------------------------------------------- // + ret = recv(axpt_fd, buf, BUFSIZE, 0); + if (ret == -1) + { + perror("err recv()"); + if (send(axpt_fd, MSG_BOUNCE, sizeof MSG_BOUNCE - 1, 0) == -1) + perror("err send()"); + close(axpt_fd); + continue; + } + std::cout << "recv()\n"; + buf[ret] = '\0'; + + + // ----------------------------------------------------------------------- // + // SEND // + // act as write, write data in the socket created by accept() // + // ----------------------------------------------------------------------- // + std::cout << "send()\n"; + if (send(axpt_fd, buf, ret, 0) == -1) // echo the read + perror("err send()"); + if (send(axpt_fd, MSG_TEST, sizeof MSG_TEST - 1, 0) == -1) + perror("err send()"); + + // ----------------------------------------------------------------------- // + // CLOSE // + // close the file descriptor of the connected socket // + // ----------------------------------------------------------------------- // + close(axpt_fd); + } + + return 0; +} + diff --git a/srcs/main_hugo.cpp b/srcs/main_hugo.cpp new file mode 100644 index 0000000..ec98b84 --- /dev/null +++ b/srcs/main_hugo.cpp @@ -0,0 +1,163 @@ + +# include // close +# include // exit +# include // cout, cin +# include // errno +# include // perror +# include // memset +# include // socket, accept, listen, send, recv, bind, connect, setsockopt, getsockname +# include // sockaddr_in +# include // inet_ntoa, inet_addr, htonl, htons, ntohl, ntohs +# include // poll +# include // fcntl + +# define INVALID -1 +# define BACKLOG 20 +// test with curl http://localhost:PORT (replace PORT by the port number you choose below) +# define PORT 4040 +# define BUFSIZE 8192 +# define MSG_TEST "Le Webserv / 20 =D\n" +# define MSG_BOUNCE "bounced properly ;)\n" + +int main() +{ + struct sockaddr_in my_addr, their_addr; + int sckt_fd, axpt_fd, lstn, ret; + socklen_t addr_len; + struct pollfd poll_s; + char buf[BUFSIZE]; + + + // --------------------------------------------------------------------------- // + // SOCKET // + // // + // --------------------------------------------------------------------------- // + sckt_fd = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0); + if (sckt_fd == INVALID) + { + perror("err socket()"); + return 0; + } + std::cout << "server init\n"; + + + // --------------------------------------------------------------------------- // + // BIND // + // // + // --------------------------------------------------------------------------- // + memset(&my_addr, 0, sizeof(my_addr)); + my_addr.sin_family = AF_INET; + my_addr.sin_port = htons(PORT); + my_addr.sin_addr.s_addr = htonl(INADDR_ANY); + // my_addr.sin_addr.s_addr = inet_addr("10.12.110.57"); + bind(sckt_fd, (struct sockaddr *)&my_addr, sizeof(my_addr)); + if (sckt_fd == INVALID) + { + perror("err bind()"); + return 0; + } + std::cout << "socket bind to port: " << PORT << "\n"; + // https://beej.us/guide/bgnet/html/index-wide.html#cb29 : + // + // Sometimes, you might notice, you try to rerun a server and bind() fails, claiming “Address already in use.” What does that mean? Well, a little bit of a socket that was connected is still hanging around in the kernel, and it’s hogging the port. You can either wait for it to clear (a minute or so), or add code to your program allowing it to reuse the port, like this: + // + // int yes=1; + // + // // lose the pesky "Address already in use" error message + // if (setsockopt(listener,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof yes) == -1) { + // perror("setsockopt"); + // exit(1); + // } + + + // --------------------------------------------------------------------------- // + // LISTEN // + // mark the socket as passive, to receive incoming connection requests // + // --------------------------------------------------------------------------- // + lstn = listen(sckt_fd, BACKLOG); + if (lstn == INVALID) + { + perror("err listen()"); + return 0; + } + std::cout << "server listening\n"; + + while (1) + { + + // ----------------------------------------------------------------------- // + // ACCEPT // + // extract first connection request in the queue of the listening socket // + // and creates a new socket that is connected, and returns it // + // ----------------------------------------------------------------------- // + addr_len = sizeof(their_addr); + axpt_fd = accept(sckt_fd, (sockaddr*)&their_addr, &addr_len); + if (axpt_fd == INVALID) + { + perror("err accept()"); + continue; + } + std::cout << "server accepted a socket from: " + << inet_ntoa(their_addr.sin_addr) + << "\n"; + + + ///////////////////// + // luke version + ///////////////////// + + + // ----------------------------------------------------------------------- // + // FCNTL // + // manipulate the new socket fd to mark it as non-blocking // + // ----------------------------------------------------------------------- // + fcntl(axpt_fd, F_SETFL, O_NONBLOCK); + + + // ----------------------------------------------------------------------- // + // POLL // + // waits for an event on the axpt_fd : there is data to read // + // ----------------------------------------------------------------------- // + poll_s.fd = axpt_fd; + poll_s.events = POLLIN; // We need a way to valid POLLOUT and POLLIN at the same time (both, not one of them) + poll(&poll_s, 1, -1); + std::cout << "poll()\n"; + + + // ----------------------------------------------------------------------- // + // RECV // + // act as read, read the data of the socket created by accept() // + // ----------------------------------------------------------------------- // + ret = recv(axpt_fd, buf, BUFSIZE, 0); + if (ret == -1) + { + perror("err recv()"); + if (send(axpt_fd, MSG_BOUNCE, sizeof MSG_BOUNCE - 1, 0) == -1) + perror("err send()"); + close(axpt_fd); + continue; + } + std::cout << "recv()\n"; + buf[ret] = '\0'; + + + // ----------------------------------------------------------------------- // + // SEND // + // act as write, write data in the socket created by accept() // + // ----------------------------------------------------------------------- // + std::cout << "send()\n"; + if (send(axpt_fd, buf, ret, 0) == -1) // echo the read + perror("err send()"); + if (send(axpt_fd, MSG_TEST, sizeof MSG_TEST - 1, 0) == -1) + perror("err send()"); + + // ----------------------------------------------------------------------- // + // CLOSE // + // close the file descriptor of the connected socket // + // ----------------------------------------------------------------------- // + close(axpt_fd); + } + + return 0; +} + diff --git a/srcs/main_luke.cpp b/srcs/main_luke.cpp new file mode 100644 index 0000000..166a4c6 --- /dev/null +++ b/srcs/main_luke.cpp @@ -0,0 +1,25 @@ + +#include +#include +#include +#include "Webserv.hpp" + +int main(void) +{ + try + { + Webserv serv; + + // https://security.stackexchange.com/questions/169213/how-to-chose-a-port-to-run-an-application-on-localhost + //serv.bind(4040); + serv.bind(4040); + serv.listen(512); // 512 max connections arbitrary + serv.start(); + } + catch (std::exception& e) + { + std::cout << e.what() << '\n'; + } + return (0); +} + diff --git a/srcs/main_poll.cpp b/srcs/main_poll.cpp new file mode 100644 index 0000000..6984214 --- /dev/null +++ b/srcs/main_poll.cpp @@ -0,0 +1,308 @@ + +// https://www.ibm.com/docs/en/i/7.2?topic=designs-using-poll-instead-select + +# include // close +# include // exit +# include // cout, cin +# include // errno +# include // perror +# include // memset +# include // socket, accept, listen, send, recv, bind, connect, setsockopt, getsockname +# include // sockaddr_in +# include // inet_ntoa, inet_addr, htonl, htons, ntohl, ntohs +# include // poll +# include // fcntl +# include // ioctl + +# define FALSE 0 +# define TRUE 1 +# define SERVER_PORT 4040 + +int main () +{ + int len, rc, on = 1; + int listen_sd = -1, new_sd = -1; + int end_server = FALSE, compress_array = FALSE; + int close_conn; + char buffer[80]; + struct sockaddr_in addr; + struct pollfd fds[200]; +// struct pollfd fds[1]; +// struct pollfd fds; + int nfds = 1, current_size = 0, i, j; + + // ************************************************************* + // * Create an AF_INET stream socket to receive incoming * + // * connections on * + // ************************************************************* + listen_sd = socket(AF_INET, SOCK_STREAM, 0); + if (listen_sd < 0) + { + perror("socket() failed"); + exit(-1); + } + + // ************************************************************* + // * Allow socket descriptor to be reuseable * + // ************************************************************* + rc = setsockopt(listen_sd, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on)); + if (rc < 0) + { + perror("setsockopt() failed"); + close(listen_sd); + exit(-1); + } + + // ************************************************************* + // * Set socket to be nonblocking. All of the sockets for * + // * the incoming connections will also be nonblocking since * + // * they will inherit that state from the listening socket. * + // ************************************************************* + rc = ioctl(listen_sd, FIONBIO, (char *)&on); + if (rc < 0) + { + perror("ioctl() failed"); + close(listen_sd); + exit(-1); + } + + // ************************************************************* + // * Bind the socket * + // ************************************************************* + memset(&addr, 0, sizeof(addr)); + addr.sin_family = AF_INET; + // memcpy(&addr.sin_addr, &inaddr_any, sizeof(inaddr_any)); + addr.sin_addr.s_addr = htonl(INADDR_ANY); + addr.sin_port = htons(SERVER_PORT); + rc = bind(listen_sd, (struct sockaddr *)&addr, sizeof(addr)); + if (rc < 0) + { + perror("bind() failed"); + close(listen_sd); + exit(-1); + } + + // ************************************************************* + // * Set the listen back log * + // ************************************************************* + rc = listen(listen_sd, 32); + if (rc < 0) + { + perror("listen() failed"); + close(listen_sd); + exit(-1); + } + + // ************************************************************* + // * Initialize the pollfd structure * + // ************************************************************* + memset(fds, 0 , sizeof(fds)); + + // ************************************************************* + // * Set up the initial listening socket * + // ************************************************************* + fds[0].fd = listen_sd; + fds[0].events = POLLIN; + + // ************************************************************* + // * Loop waiting for incoming connects or for incoming data * + // * on any of the connected sockets. * + // ************************************************************* + do + { + // *********************************************************** + // * Call poll() * + // *********************************************************** + poll(fds, nfds, -1); + + // *********************************************************** + // * One or more descriptors are readable. Need to * + // * determine which ones they are. * + // *********************************************************** + current_size = nfds; + for (i = 0; i < current_size; i++) + { + // ********************************************************* + // * Loop through to find the descriptors that returned * + // * POLLIN and determine whether it's the listening * + // * or the active connection. * + // ********************************************************* + if(fds[i].revents == 0) + continue; + + // ********************************************************* + // * If revents is not POLLIN, it's an unexpected result, * + // * log and end the server. * + // ********************************************************* + if(fds[i].revents != POLLIN) + { + printf(" Error! revents = %d\n", fds[i].revents); + end_server = TRUE; + break; + + } + if (fds[i].fd == listen_sd) + { + // ******************************************************* + // * Listening descriptor is readable. * + // ******************************************************* + printf(" Listening socket is readable\n"); + + // ******************************************************* + // * Accept all incoming connections that are * + // * queued up on the listening socket before we * + // * loop back and call poll again. * + // ******************************************************* + do + { + // ***************************************************** + // * Accept each incoming connection. If * + // * accept fails with EWOULDBLOCK, then we * + // * have accepted all of them. Any other * + // * failure on accept will cause us to end the * + // * server. * + // ***************************************************** + new_sd = accept(listen_sd, NULL, NULL); + if (new_sd < 0) + { + if (errno != EWOULDBLOCK) + { + perror(" accept() failed"); + end_server = TRUE; + } + break; + } + + // ***************************************************** + // * Add the new incoming connection to the * + // * pollfd structure * + // ***************************************************** + printf(" New incoming connection - %d\n", new_sd); + fds[nfds].fd = new_sd; + fds[nfds].events = POLLIN; + nfds++; + + // ***************************************************** + // * Loop back up and accept another incoming * + // * connection * + // ***************************************************** + } while (new_sd != -1); + } + + // ********************************************************* + // * This is not the listening socket, therefore an * + // * existing connection must be readable * + // ********************************************************* + + else + { + printf(" Descriptor %d is readable\n", fds[i].fd); + close_conn = FALSE; + // ******************************************************* + // * Receive all incoming data on this socket * + // * before we loop back and call poll again. * + // ******************************************************* + + do + { + // ***************************************************** + // * Receive data on this connection until the * + // * recv fails with EWOULDBLOCK. If any other * + // * failure occurs, we will close the * + // * connection. * + // ***************************************************** + rc = recv(fds[i].fd, buffer, sizeof(buffer), 0); + if (rc < 0) + { + if (errno != EWOULDBLOCK) + { + perror(" recv() failed"); + close_conn = TRUE; + } + break; + } + + // ***************************************************** + // * Check to see if the connection has been * + // * closed by the client * + // ***************************************************** + if (rc == 0) + { + printf(" Connection closed\n"); + close_conn = TRUE; + break; + } + + // ***************************************************** + // * Data was received * + // ***************************************************** + len = rc; + printf(" %d bytes received\n", len); + + // ***************************************************** + // * Echo the data back to the client * + // ***************************************************** + rc = send(fds[i].fd, buffer, len, 0); + if (rc < 0) + { + perror(" send() failed"); + close_conn = TRUE; + break; + } + + } while(TRUE); + + // ******************************************************* + // * If the close_conn flag was turned on, we need * + // * to clean up this active connection. This * + // * clean up process includes removing the * + // * descriptor. * + // ******************************************************* + if (close_conn) + { + close(fds[i].fd); + fds[i].fd = -1; + compress_array = TRUE; + } + + + } // End of existing connection is readable + } // End of loop through pollable descriptors + + // *********************************************************** + // * If the compress_array flag was turned on, we need * + // * to squeeze together the array and decrement the number * + // * of file descriptors. We do not need to move back the * + // * events and revents fields because the events will always* + // * be POLLIN in this case, and revents is output. * + // *********************************************************** + if (compress_array) + { + compress_array = FALSE; + for (i = 0; i < nfds; i++) + { + if (fds[i].fd == -1) + { + for(j = i; j < nfds; j++) + { + fds[j].fd = fds[j+1].fd; + } + i--; + nfds--; + } + } + } + + } while (end_server == FALSE); // End of serving running. + + // ************************************************************* + // * Clean up all of the sockets that are open * + // ************************************************************* + for (i = 0; i < nfds; i++) + { + if(fds[i].fd >= 0) + close(fds[i].fd); + } +} + + diff --git a/srcs/main_select.cpp b/srcs/main_select.cpp new file mode 100644 index 0000000..3bad22e --- /dev/null +++ b/srcs/main_select.cpp @@ -0,0 +1,303 @@ + +# include // close +# include +# include +# include +# include +# include +# include +# include +# include + +#define SERVER_PORT 4040 + +#define TRUE 1 +#define FALSE 0 + +int main () +{ + int i, len, rc, on = 1; + int listen_sd, max_sd, new_sd; + int desc_ready, end_server = FALSE; + int close_conn; + char buffer[80]; + struct sockaddr_in6 addr; + struct timeval timeout; + fd_set master_set, working_set; + + /*************************************************************/ + /* Create an AF_INET6 stream socket to receive incoming */ + /* connections on */ + /*************************************************************/ + listen_sd = socket(AF_INET6, SOCK_STREAM, 0); + if (listen_sd < 0) + { + perror("socket() failed"); + exit(-1); + } + + /*************************************************************/ + /* Allow socket descriptor to be reuseable */ + /*************************************************************/ + rc = setsockopt(listen_sd, SOL_SOCKET, SO_REUSEADDR, + (char *)&on, sizeof(on)); + if (rc < 0) + { + perror("setsockopt() failed"); + close(listen_sd); + exit(-1); + } + + /*************************************************************/ + /* Set socket to be nonblocking. All of the sockets for */ + /* the incoming connections will also be nonblocking since */ + /* they will inherit that state from the listening socket. */ + /*************************************************************/ + rc = ioctl(listen_sd, FIONBIO, (char *)&on); + if (rc < 0) + { + perror("ioctl() failed"); + close(listen_sd); + exit(-1); + } + + /*************************************************************/ + /* Bind the socket */ + /*************************************************************/ + memset(&addr, 0, sizeof(addr)); + addr.sin6_family = AF_INET6; + memcpy(&addr.sin6_addr, &in6addr_any, sizeof(in6addr_any)); + addr.sin6_port = htons(SERVER_PORT); + rc = bind(listen_sd, + (struct sockaddr *)&addr, sizeof(addr)); + if (rc < 0) + { + perror("bind() failed"); + close(listen_sd); + exit(-1); + } + + /*************************************************************/ + /* Set the listen back log */ + /*************************************************************/ + rc = listen(listen_sd, 32); + if (rc < 0) + { + perror("listen() failed"); + close(listen_sd); + exit(-1); + } + + /*************************************************************/ + /* Initialize the master fd_set */ + /*************************************************************/ + FD_ZERO(&master_set); + max_sd = listen_sd; + FD_SET(listen_sd, &master_set); + + /*************************************************************/ + /* Initialize the timeval struct to 3 minutes. If no */ + /* activity after 3 minutes this program will end. */ + /*************************************************************/ + timeout.tv_sec = 3 * 60; + timeout.tv_usec = 0; + + /*************************************************************/ + /* Loop waiting for incoming connects or for incoming data */ + /* on any of the connected sockets. */ + /*************************************************************/ + do + { + /**********************************************************/ + /* Copy the master fd_set over to the working fd_set. */ + /**********************************************************/ + memcpy(&working_set, &master_set, sizeof(master_set)); + + /**********************************************************/ + /* Call select() and wait 3 minutes for it to complete. */ + /**********************************************************/ + printf("Waiting on select()...\n"); + rc = select(max_sd + 1, &working_set, NULL, NULL, &timeout); + + /**********************************************************/ + /* Check to see if the select call failed. */ + /**********************************************************/ + if (rc < 0) + { + perror(" select() failed"); + break; + } + + /**********************************************************/ + /* Check to see if the 3 minute time out expired. */ + /**********************************************************/ + if (rc == 0) + { + printf(" select() timed out. End program.\n"); + break; + } + + /**********************************************************/ + /* One or more descriptors are readable. Need to */ + /* determine which ones they are. */ + /**********************************************************/ + desc_ready = rc; + for (i=0; i <= max_sd && desc_ready > 0; ++i) + { + /*******************************************************/ + /* Check to see if this descriptor is ready */ + /*******************************************************/ + if (FD_ISSET(i, &working_set)) + { + /****************************************************/ + /* A descriptor was found that was readable - one */ + /* less has to be looked for. This is being done */ + /* so that we can stop looking at the working set */ + /* once we have found all of the descriptors that */ + /* were ready. */ + /****************************************************/ + desc_ready -= 1; + + /****************************************************/ + /* Check to see if this is the listening socket */ + /****************************************************/ + if (i == listen_sd) + { + printf(" Listening socket is readable\n"); + /*************************************************/ + /* Accept all incoming connections that are */ + /* queued up on the listening socket before we */ + /* loop back and call select again. */ + /*************************************************/ + do + { + /**********************************************/ + /* Accept each incoming connection. If */ + /* accept fails with EWOULDBLOCK, then we */ + /* have accepted all of them. Any other */ + /* failure on accept will cause us to end the */ + /* server. */ + /**********************************************/ + new_sd = accept(listen_sd, NULL, NULL); + if (new_sd < 0) + { + if (errno != EWOULDBLOCK) + { + perror(" accept() failed"); + end_server = TRUE; + } + break; + } + + /**********************************************/ + /* Add the new incoming connection to the */ + /* master read set */ + /**********************************************/ + printf(" New incoming connection - %d\n", new_sd); + FD_SET(new_sd, &master_set); + if (new_sd > max_sd) + max_sd = new_sd; + + /**********************************************/ + /* Loop back up and accept another incoming */ + /* connection */ + /**********************************************/ + } while (new_sd != -1); + } + + /****************************************************/ + /* This is not the listening socket, therefore an */ + /* existing connection must be readable */ + /****************************************************/ + else + { + printf(" Descriptor %d is readable\n", i); + close_conn = FALSE; + /*************************************************/ + /* Receive all incoming data on this socket */ + /* before we loop back and call select again. */ + /*************************************************/ + do + { + /**********************************************/ + /* Receive data on this connection until the */ + /* recv fails with EWOULDBLOCK. If any other */ + /* failure occurs, we will close the */ + /* connection. */ + /**********************************************/ + rc = recv(i, buffer, sizeof(buffer), 0); + if (rc < 0) + { + if (errno != EWOULDBLOCK) + { + perror(" recv() failed"); + close_conn = TRUE; + } + break; + } + + /**********************************************/ + /* Check to see if the connection has been */ + /* closed by the client */ + /**********************************************/ + if (rc == 0) + { + printf(" Connection closed\n"); + close_conn = TRUE; + break; + } + + /**********************************************/ + /* Data was received */ + /**********************************************/ + len = rc; + printf(" %d bytes received\n", len); + + /**********************************************/ + /* Echo the data back to the client */ + /**********************************************/ + rc = send(i, buffer, len, 0); + if (rc < 0) + { + perror(" send() failed"); + close_conn = TRUE; + break; + } + + } while (TRUE); + + /*************************************************/ + /* If the close_conn flag was turned on, we need */ + /* to clean up this active connection. This */ + /* clean up process includes removing the */ + /* descriptor from the master set and */ + /* determining the new maximum descriptor value */ + /* based on the bits that are still turned on in */ + /* the master set. */ + /*************************************************/ + if (close_conn) + { + close(i); + FD_CLR(i, &master_set); + if (i == max_sd) + { + while (FD_ISSET(max_sd, &master_set) == FALSE) + max_sd -= 1; + } + } + } /* End of existing connection is readable */ + } /* End of if (FD_ISSET(i, &working_set)) */ + } /* End of loop through selectable descriptors */ + + } while (end_server == FALSE); + + /*************************************************************/ + /* Clean up all of the sockets that are open */ + /*************************************************************/ + for (i=0; i <= max_sd; ++i) + { + if (FD_ISSET(i, &master_set)) + close(i); + } +} + diff --git a/webserv b/webserv index eb88ea064a7d2e3abab39dd617a677f089d3058c..6062bbdfcfae079d92724809cfc5c2230d29d14e 100755 GIT binary patch literal 123032 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