diff options
author | Dan Goodliffe <dan@randomdan.homeip.net> | 2018-05-29 19:53:30 +0100 |
---|---|---|
committer | Dan Goodliffe <dan@randomdan.homeip.net> | 2018-06-04 19:00:28 +0100 |
commit | 140a6858cf8e07b4f65720ba1c24142cc287b700 (patch) | |
tree | 08425d1673a04e546005c6fc20263a18ed5d9039 /icespider/embedded/embedded.h | |
parent | Remove parameter setters from ihttpRequest (diff) | |
download | icespider-140a6858cf8e07b4f65720ba1c24142cc287b700.tar.bz2 icespider-140a6858cf8e07b4f65720ba1c24142cc287b700.tar.xz icespider-140a6858cf8e07b4f65720ba1c24142cc287b700.zip |
Initial commit of embedded server
First cut of a light-weight multi-threaded HTTP daemon library.
Let's be honest... it does nothing yet, but it's our starting point.
Diffstat (limited to 'icespider/embedded/embedded.h')
-rw-r--r-- | icespider/embedded/embedded.h | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/icespider/embedded/embedded.h b/icespider/embedded/embedded.h new file mode 100644 index 0000000..08f280a --- /dev/null +++ b/icespider/embedded/embedded.h @@ -0,0 +1,105 @@ +#ifndef ICESPIDER_EMBEDDED_H +#define ICESPIDER_EMBEDDED_H + +#include <sys/select.h> +#include <netinet/in.h> +#include <visibility.h> +#include <memory> +#include <array> +#include <vector> +#include <future> +#include </usr/include/semaphore.h> +#include <blockingconcurrentqueue.h> + +namespace IceSpider::Embedded { + class Listener; + + enum class FDSetChange { + NoChange, + AddNew, + Remove, + }; + typedef std::tuple<FDSetChange> SocketEventResult; + typedef std::future<SocketEventResult> SocketEventResultFuture; + typedef std::tuple<int, SocketEventResultFuture> FdSocketEventResultFuture; + + class SocketHandler { + public: + typedef std::packaged_task<SocketEventResult()> Work; + + SocketHandler(int f); + ~SocketHandler(); + + static inline FdSocketEventResultFuture returnNow(int, const SocketEventResult &&); + static inline FdSocketEventResultFuture returnQueued(Listener *, int, Work &&); + + virtual FdSocketEventResultFuture read(Listener *) = 0; + virtual FdSocketEventResultFuture except(Listener *); + + const int fd; + }; + + class ClientSocket : public SocketHandler { + public: + ClientSocket(int fd); + + FdSocketEventResultFuture read(Listener * listener) override; + + private: + inline void read_headers(int bytes); + inline void stream_input(int bytes); + + enum class State { + reading_headers, + streaming_input, + }; + + struct sockaddr_in clientaddr; + std::vector<char> buf; + std::size_t rec; + State state; + }; + + class ListenSocket : public SocketHandler { + public: + ListenSocket(unsigned short portno); + + FdSocketEventResultFuture read(Listener * listener) override; + + private: + struct sockaddr_in serveraddr; + }; + + class DLL_PUBLIC Listener { + public: + typedef moodycamel::BlockingConcurrentQueue<SocketHandler::Work> WorkQueue; + + Listener(); + Listener(unsigned short portno); + ~Listener(); + + int listen(unsigned short portno); + void unlisten(int fd); + + void run(); + + template<typename T, typename ... P> inline int create(const P & ... p); + + WorkQueue work; + + private: + inline void add(int fd); + inline void remove(int fd); + + void worker(); + + typedef std::unique_ptr<SocketHandler> SocketPtr; + typedef std::array<SocketPtr, 1024> Sockets; + int topSock; + Sockets sockets; + fd_set rfds, wfds, efds; + }; +}; + +#endif + |