1 // 2 // detail/socket_holder.hpp 3 // ~~~~~~~~~~~~~~~~~~~~~~~~ 4 // 5 // Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com) 6 // 7 // Distributed under the Boost Software License, Version 1.0. (See accompanying 8 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 9 // 10 11 #ifndef ASIO_DETAIL_SOCKET_HOLDER_HPP 12 #define ASIO_DETAIL_SOCKET_HOLDER_HPP 13 14 15 #include "asio/detail/config.hpp" 16 #include "asio/detail/noncopyable.hpp" 17 #include "asio/detail/socket_ops.hpp" 18 19 #include "asio/detail/push_options.hpp" 20 21 namespace asio { 22 namespace detail { 23 24 // Implement the resource acquisition is initialisation idiom for sockets. 25 class socket_holder 26 : private noncopyable 27 { 28 public: 29 // Construct as an uninitialised socket. socket_holder()30 socket_holder() 31 : socket_(invalid_socket) 32 { 33 } 34 35 // Construct to take ownership of the specified socket. socket_holder(socket_type s)36 explicit socket_holder(socket_type s) 37 : socket_(s) 38 { 39 } 40 41 // Destructor. ~socket_holder()42 ~socket_holder() 43 { 44 if (socket_ != invalid_socket) 45 { 46 asio::error_code ec; 47 socket_ops::state_type state = 0; 48 socket_ops::close(socket_, state, true, ec); 49 } 50 } 51 52 // Get the underlying socket. get() const53 socket_type get() const 54 { 55 return socket_; 56 } 57 58 // Reset to an uninitialised socket. reset()59 void reset() 60 { 61 if (socket_ != invalid_socket) 62 { 63 asio::error_code ec; 64 socket_ops::state_type state = 0; 65 socket_ops::close(socket_, state, true, ec); 66 socket_ = invalid_socket; 67 } 68 } 69 70 // Reset to take ownership of the specified socket. reset(socket_type s)71 void reset(socket_type s) 72 { 73 reset(); 74 socket_ = s; 75 } 76 77 // Release ownership of the socket. release()78 socket_type release() 79 { 80 socket_type tmp = socket_; 81 socket_ = invalid_socket; 82 return tmp; 83 } 84 85 private: 86 // The underlying socket. 87 socket_type socket_; 88 }; 89 90 } // namespace detail 91 } // namespace asio 92 93 #include "asio/detail/pop_options.hpp" 94 95 #endif // ASIO_DETAIL_SOCKET_HOLDER_HPP 96