#pragma once #ifdef WIN32 #include #pragma comment(lib, "ws2_32.lib") #undef max #elif POSIX #include #include #include #include #include #include #include #else #error "Undefine platform" #endif #include "System.h" #include #include #include #include #include namespace HttpServer { class Socket { protected: System::native_socket_type socket_handle; public: int static Startup(); int static Cleanup(); public: Socket(); Socket(const System::native_socket_type); Socket(const Socket &); Socket(Socket &&); ~Socket() = default; System::native_socket_type open(); int close(); inline bool is_open() const { #ifdef WIN32 return INVALID_SOCKET != socket_handle; #elif POSIX return ~0 != socket_handle; #else #error "Undefine platform" #endif } int bind(const int) const; int listen() const; Socket accept() const; Socket nonblock_accept() const; Socket nonblock_accept(const std::chrono::milliseconds &) const; int shutdown() const; bool nonblock(const bool = true) const; // bool is_nonblock() const; size_t recv(std::vector &) const; size_t nonblock_recv(std::vector &, const std::chrono::milliseconds &) const; size_t send(const std::string &) const; size_t send(const std::vector &, const size_t) const; size_t nonblock_send(const std::string &, const std::chrono::milliseconds &) const; size_t nonblock_send(const std::vector &, const size_t, const std::chrono::milliseconds &) const; inline System::native_socket_type get_handle() const { return socket_handle; } Socket &operator =(const Socket); }; };