diff --git a/include/sockpp/connector.h b/include/sockpp/connector.h index 2d571da..d182d8f 100644 --- a/include/sockpp/connector.h +++ b/include/sockpp/connector.h @@ -70,7 +70,7 @@ class connector : public stream_socket connector& operator=(const connector&) = delete; /** Recreate the socket with a new handle, closing any old one. */ - bool recreate(const sock_address& addr); + result recreate(const sock_address& addr); public: /** @@ -133,7 +133,7 @@ public: * @param addr The remote server address. * @return @em true on success, @em false on error */ - bool connect(const sock_address& addr); + result connect(const sock_address& addr); /** * Attempts to connect to the specified server, with a timeout. * If the socket is currently connected, this will close the current @@ -144,7 +144,7 @@ public: * @param timeout The duration after which to give up. Zero means never. * @return @em true on success, @em false on error */ - bool connect(const sock_address& addr, std::chrono::microseconds timeout); + result connect(const sock_address& addr, std::chrono::microseconds timeout); /** * Attempts to connect to the specified server, with a timeout. * If the socket is currently connected, this will close the current @@ -156,7 +156,7 @@ public: * @return @em true on success, @em false on error */ template - bool connect( + result connect( const sock_address& addr, const std::chrono::duration& relTime ) { return connect(addr, std::chrono::microseconds(relTime)); diff --git a/include/sockpp/result.h b/include/sockpp/result.h index 0aeddd9..77f75c0 100644 --- a/include/sockpp/result.h +++ b/include/sockpp/result.h @@ -122,9 +122,14 @@ public: result() = default; /** * Construct a "success" result with the specified value. - * @param val The success return value + * @param val The success value */ result(const T& val) : val_{val} {} + /** + * Construct a "success" result with the specified value. + * @param val The success value + */ + result(T&& val) : val_{std::move(val)} {} /** * Creates an unsuccesful result from a portable error condition. * @param err The error @@ -227,6 +232,17 @@ result success(const T& val) { return result(val); } +/** + * Create a successful result with the specified value. + * + * @param val The succesful return value from the operation. + * @return A success result. + */ +template +result success(T&& val) { + return result(std::move(val)); +} + /** * Create a failed result with the specified error code. * diff --git a/src/connector.cpp b/src/connector.cpp index cfbd506..e752c4f 100644 --- a/src/connector.cpp +++ b/src/connector.cpp @@ -50,38 +50,40 @@ namespace sockpp { ///////////////////////////////////////////////////////////////////////////// -bool connector::recreate(const sock_address& addr) { +result connector::recreate(const sock_address& addr) { sa_family_t domain = addr.family(); socket_t h = create_handle(domain); if (!check_socket_bool(h)) - return false; + return last_error(); // This will close the old connection, if any. reset(h); - return true; + return none{}; } ///////////////////////////////////////////////////////////////////////////// -bool connector::connect(const sock_address& addr) { - if (!recreate(addr)) - return false; +result connector::connect(const sock_address& addr) { + auto res = recreate(addr); + if (!res) + return res; if (!check_ret_bool(::connect(handle(), addr.sockaddr_ptr(), addr.size()))) - return close_on_err(); + return last_error(); - return true; + return none{}; } ///////////////////////////////////////////////////////////////////////////// -bool connector::connect(const sock_address& addr, microseconds timeout) { +result connector::connect(const sock_address& addr, microseconds timeout) { if (timeout.count() <= 0) return connect(addr); - if (!recreate(addr)) - return false; + auto res = recreate(addr); + if (!res) + return res; bool non_blocking = #if defined(_WIN32) @@ -126,9 +128,10 @@ bool connector::connect(const sock_address& addr, microseconds timeout) { } } - if (last_error()) { + auto last_err = last_error(); + if (last_err) { close(); - return false; + return last_err; } } @@ -136,7 +139,7 @@ bool connector::connect(const sock_address& addr, microseconds timeout) { if (!non_blocking) set_non_blocking(false); - return true; + return none{}; } /////////////////////////////////////////////////////////////////////////////