summaryrefslogtreecommitdiff
path: root/boost/asio/connect.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/asio/connect.hpp')
-rw-r--r--boost/asio/connect.hpp686
1 files changed, 461 insertions, 225 deletions
diff --git a/boost/asio/connect.hpp b/boost/asio/connect.hpp
index 635a8ad9bd..e31e8c92cd 100644
--- a/boost/asio/connect.hpp
+++ b/boost/asio/connect.hpp
@@ -18,6 +18,7 @@
#include <boost/asio/detail/config.hpp>
#include <boost/asio/async_result.hpp>
#include <boost/asio/basic_socket.hpp>
+#include <boost/asio/detail/type_traits.hpp>
#include <boost/asio/error.hpp>
#include <boost/asio/detail/push_options.hpp>
@@ -25,6 +26,36 @@
namespace boost {
namespace asio {
+namespace detail
+{
+ char (&has_iterator_helper(...))[2];
+
+ template <typename T>
+ char has_iterator_helper(T*, typename T::iterator* = 0);
+
+ template <typename T>
+ struct has_iterator_typedef
+ {
+ enum { value = (sizeof((has_iterator_helper)((T*)(0))) == 1) };
+ };
+} // namespace detail
+
+/// Type trait used to determine whether a type is an endpoint sequence that can
+/// be used with with @c connect and @c async_connect.
+template <typename T>
+struct is_endpoint_sequence
+{
+#if defined(GENERATING_DOCUMENTATION)
+ /// The value member is true if the type may be used as an endpoint sequence.
+ static const bool value;
+#else
+ enum
+ {
+ value = detail::has_iterator_typedef<T>::value
+ };
+#endif
+};
+
/**
* @defgroup connect boost::asio::connect
*
@@ -42,27 +73,26 @@ namespace asio {
* @param s The socket to be connected. If the socket is already open, it will
* be closed.
*
- * @param begin An iterator pointing to the start of a sequence of endpoints.
+ * @param endpoints A sequence of endpoints.
*
- * @returns On success, an iterator denoting the successfully connected
- * endpoint. Otherwise, the end iterator.
+ * @returns The successfully connected endpoint.
*
* @throws boost::system::system_error Thrown on failure. If the sequence is
* empty, the associated @c error_code is boost::asio::error::not_found.
* Otherwise, contains the error from the last connection attempt.
*
- * @note This overload assumes that a default constructed object of type @c
- * Iterator represents the end of the sequence. This is a valid assumption for
- * iterator types such as @c boost::asio::ip::tcp::resolver::iterator.
- *
* @par Example
- * @code tcp::resolver r(io_service);
+ * @code tcp::resolver r(io_context);
* tcp::resolver::query q("host", "service");
- * tcp::socket s(io_service);
+ * tcp::socket s(io_context);
* boost::asio::connect(s, r.resolve(q)); @endcode
*/
-template <typename Protocol, typename SocketService, typename Iterator>
-Iterator connect(basic_socket<Protocol, SocketService>& s, Iterator begin);
+template <typename Protocol BOOST_ASIO_SVC_TPARAM, typename EndpointSequence>
+typename Protocol::endpoint connect(
+ basic_socket<Protocol BOOST_ASIO_SVC_TARG>& s,
+ const EndpointSequence& endpoints,
+ typename enable_if<is_endpoint_sequence<
+ EndpointSequence>::value>::type* = 0);
/// Establishes a socket connection by trying each endpoint in a sequence.
/**
@@ -74,23 +104,19 @@ Iterator connect(basic_socket<Protocol, SocketService>& s, Iterator begin);
* @param s The socket to be connected. If the socket is already open, it will
* be closed.
*
- * @param begin An iterator pointing to the start of a sequence of endpoints.
+ * @param endpoints A sequence of endpoints.
*
* @param ec Set to indicate what error occurred, if any. If the sequence is
* empty, set to boost::asio::error::not_found. Otherwise, contains the error
* from the last connection attempt.
*
- * @returns On success, an iterator denoting the successfully connected
- * endpoint. Otherwise, the end iterator.
- *
- * @note This overload assumes that a default constructed object of type @c
- * Iterator represents the end of the sequence. This is a valid assumption for
- * iterator types such as @c boost::asio::ip::tcp::resolver::iterator.
+ * @returns On success, the successfully connected endpoint. Otherwise, a
+ * default-constructed endpoint.
*
* @par Example
- * @code tcp::resolver r(io_service);
+ * @code tcp::resolver r(io_context);
* tcp::resolver::query q("host", "service");
- * tcp::socket s(io_service);
+ * tcp::socket s(io_context);
* boost::system::error_code ec;
* boost::asio::connect(s, r.resolve(q), ec);
* if (ec)
@@ -98,11 +124,16 @@ Iterator connect(basic_socket<Protocol, SocketService>& s, Iterator begin);
* // An error occurred.
* } @endcode
*/
-template <typename Protocol, typename SocketService, typename Iterator>
-Iterator connect(basic_socket<Protocol, SocketService>& s,
- Iterator begin, boost::system::error_code& ec);
+template <typename Protocol BOOST_ASIO_SVC_TPARAM, typename EndpointSequence>
+typename Protocol::endpoint connect(
+ basic_socket<Protocol BOOST_ASIO_SVC_TARG>& s,
+ const EndpointSequence& endpoints, boost::system::error_code& ec,
+ typename enable_if<is_endpoint_sequence<
+ EndpointSequence>::value>::type* = 0);
-/// Establishes a socket connection by trying each endpoint in a sequence.
+#if !defined(BOOST_ASIO_NO_DEPRECATED)
+/// (Deprecated.) Establishes a socket connection by trying each endpoint in a
+/// sequence.
/**
* This function attempts to connect a socket to one of a sequence of
* endpoints. It does this by repeated calls to the socket's @c connect member
@@ -114,24 +145,80 @@ Iterator connect(basic_socket<Protocol, SocketService>& s,
*
* @param begin An iterator pointing to the start of a sequence of endpoints.
*
- * @param end An iterator pointing to the end of a sequence of endpoints.
+ * @returns On success, an iterator denoting the successfully connected
+ * endpoint. Otherwise, the end iterator.
+ *
+ * @throws boost::system::system_error Thrown on failure. If the sequence is
+ * empty, the associated @c error_code is boost::asio::error::not_found.
+ * Otherwise, contains the error from the last connection attempt.
+ *
+ * @note This overload assumes that a default constructed object of type @c
+ * Iterator represents the end of the sequence. This is a valid assumption for
+ * iterator types such as @c boost::asio::ip::tcp::resolver::iterator.
+ */
+template <typename Protocol BOOST_ASIO_SVC_TPARAM, typename Iterator>
+Iterator connect(basic_socket<Protocol BOOST_ASIO_SVC_TARG>& s, Iterator begin,
+ typename enable_if<!is_endpoint_sequence<Iterator>::value>::type* = 0);
+
+/// (Deprecated.) Establishes a socket connection by trying each endpoint in a
+/// sequence.
+/**
+ * This function attempts to connect a socket to one of a sequence of
+ * endpoints. It does this by repeated calls to the socket's @c connect member
+ * function, once for each endpoint in the sequence, until a connection is
+ * successfully established.
+ *
+ * @param s The socket to be connected. If the socket is already open, it will
+ * be closed.
+ *
+ * @param begin An iterator pointing to the start of a sequence of endpoints.
+ *
+ * @param ec Set to indicate what error occurred, if any. If the sequence is
+ * empty, set to boost::asio::error::not_found. Otherwise, contains the error
+ * from the last connection attempt.
*
* @returns On success, an iterator denoting the successfully connected
* endpoint. Otherwise, the end iterator.
*
+ * @note This overload assumes that a default constructed object of type @c
+ * Iterator represents the end of the sequence. This is a valid assumption for
+ * iterator types such as @c boost::asio::ip::tcp::resolver::iterator.
+ */
+template <typename Protocol BOOST_ASIO_SVC_TPARAM, typename Iterator>
+Iterator connect(basic_socket<Protocol BOOST_ASIO_SVC_TARG>& s,
+ Iterator begin, boost::system::error_code& ec,
+ typename enable_if<!is_endpoint_sequence<Iterator>::value>::type* = 0);
+#endif // !defined(BOOST_ASIO_NO_DEPRECATED)
+
+/// Establishes a socket connection by trying each endpoint in a sequence.
+/**
+ * This function attempts to connect a socket to one of a sequence of
+ * endpoints. It does this by repeated calls to the socket's @c connect member
+ * function, once for each endpoint in the sequence, until a connection is
+ * successfully established.
+ *
+ * @param s The socket to be connected. If the socket is already open, it will
+ * be closed.
+ *
+ * @param begin An iterator pointing to the start of a sequence of endpoints.
+ *
+ * @param end An iterator pointing to the end of a sequence of endpoints.
+ *
+ * @returns An iterator denoting the successfully connected endpoint.
+ *
* @throws boost::system::system_error Thrown on failure. If the sequence is
* empty, the associated @c error_code is boost::asio::error::not_found.
* Otherwise, contains the error from the last connection attempt.
*
* @par Example
- * @code tcp::resolver r(io_service);
+ * @code tcp::resolver r(io_context);
* tcp::resolver::query q("host", "service");
- * tcp::resolver::iterator i = r.resolve(q), end;
- * tcp::socket s(io_service);
- * boost::asio::connect(s, i, end); @endcode
+ * tcp::resolver::results_type e = r.resolve(q);
+ * tcp::socket s(io_context);
+ * boost::asio::connect(s, e.begin(), e.end()); @endcode
*/
-template <typename Protocol, typename SocketService, typename Iterator>
-Iterator connect(basic_socket<Protocol, SocketService>& s,
+template <typename Protocol BOOST_ASIO_SVC_TPARAM, typename Iterator>
+Iterator connect(basic_socket<Protocol BOOST_ASIO_SVC_TARG>& s,
Iterator begin, Iterator end);
/// Establishes a socket connection by trying each endpoint in a sequence.
@@ -156,19 +243,19 @@ Iterator connect(basic_socket<Protocol, SocketService>& s,
* endpoint. Otherwise, the end iterator.
*
* @par Example
- * @code tcp::resolver r(io_service);
+ * @code tcp::resolver r(io_context);
* tcp::resolver::query q("host", "service");
- * tcp::resolver::iterator i = r.resolve(q), end;
- * tcp::socket s(io_service);
+ * tcp::resolver::results_type e = r.resolve(q);
+ * tcp::socket s(io_context);
* boost::system::error_code ec;
- * boost::asio::connect(s, i, end, ec);
+ * boost::asio::connect(s, e.begin(), e.end(), ec);
* if (ec)
* {
* // An error occurred.
* } @endcode
*/
-template <typename Protocol, typename SocketService, typename Iterator>
-Iterator connect(basic_socket<Protocol, SocketService>& s,
+template <typename Protocol BOOST_ASIO_SVC_TPARAM, typename Iterator>
+Iterator connect(basic_socket<Protocol BOOST_ASIO_SVC_TARG>& s,
Iterator begin, Iterator end, boost::system::error_code& ec);
/// Establishes a socket connection by trying each endpoint in a sequence.
@@ -181,59 +268,54 @@ Iterator connect(basic_socket<Protocol, SocketService>& s,
* @param s The socket to be connected. If the socket is already open, it will
* be closed.
*
- * @param begin An iterator pointing to the start of a sequence of endpoints.
+ * @param endpoints A sequence of endpoints.
*
* @param connect_condition A function object that is called prior to each
* connection attempt. The signature of the function object must be:
- * @code Iterator connect_condition(
+ * @code bool connect_condition(
* const boost::system::error_code& ec,
- * Iterator next); @endcode
+ * const typename Protocol::endpoint& next); @endcode
* The @c ec parameter contains the result from the most recent connect
* operation. Before the first connection attempt, @c ec is always set to
- * indicate success. The @c next parameter is an iterator pointing to the next
- * endpoint to be tried. The function object should return the next iterator,
- * but is permitted to return a different iterator so that endpoints may be
- * skipped. The implementation guarantees that the function object will never
- * be called with the end iterator.
+ * indicate success. The @c next parameter is the next endpoint to be tried.
+ * The function object should return true if the next endpoint should be tried,
+ * and false if it should be skipped.
*
- * @returns On success, an iterator denoting the successfully connected
- * endpoint. Otherwise, the end iterator.
+ * @returns The successfully connected endpoint.
*
* @throws boost::system::system_error Thrown on failure. If the sequence is
* empty, the associated @c error_code is boost::asio::error::not_found.
* Otherwise, contains the error from the last connection attempt.
*
- * @note This overload assumes that a default constructed object of type @c
- * Iterator represents the end of the sequence. This is a valid assumption for
- * iterator types such as @c boost::asio::ip::tcp::resolver::iterator.
- *
* @par Example
* The following connect condition function object can be used to output
* information about the individual connection attempts:
* @code struct my_connect_condition
* {
- * template <typename Iterator>
- * Iterator operator()(
+ * bool operator()(
* const boost::system::error_code& ec,
- * Iterator next)
+ * const::tcp::endpoint& next)
* {
* if (ec) std::cout << "Error: " << ec.message() << std::endl;
- * std::cout << "Trying: " << next->endpoint() << std::endl;
- * return next;
+ * std::cout << "Trying: " << next << std::endl;
+ * return true;
* }
* }; @endcode
* It would be used with the boost::asio::connect function as follows:
- * @code tcp::resolver r(io_service);
+ * @code tcp::resolver r(io_context);
* tcp::resolver::query q("host", "service");
- * tcp::socket s(io_service);
- * tcp::resolver::iterator i = boost::asio::connect(
- * s, r.resolve(q), my_connect_condition());
- * std::cout << "Connected to: " << i->endpoint() << std::endl; @endcode
+ * tcp::socket s(io_context);
+ * tcp::endpoint e = boost::asio::connect(s,
+ * r.resolve(q), my_connect_condition());
+ * std::cout << "Connected to: " << e << std::endl; @endcode
*/
-template <typename Protocol, typename SocketService,
- typename Iterator, typename ConnectCondition>
-Iterator connect(basic_socket<Protocol, SocketService>& s,
- Iterator begin, ConnectCondition connect_condition);
+template <typename Protocol BOOST_ASIO_SVC_TPARAM,
+ typename EndpointSequence, typename ConnectCondition>
+typename Protocol::endpoint connect(
+ basic_socket<Protocol BOOST_ASIO_SVC_TARG>& s,
+ const EndpointSequence& endpoints, ConnectCondition connect_condition,
+ typename enable_if<is_endpoint_sequence<
+ EndpointSequence>::value>::type* = 0);
/// Establishes a socket connection by trying each endpoint in a sequence.
/**
@@ -245,67 +327,148 @@ Iterator connect(basic_socket<Protocol, SocketService>& s,
* @param s The socket to be connected. If the socket is already open, it will
* be closed.
*
- * @param begin An iterator pointing to the start of a sequence of endpoints.
+ * @param endpoints A sequence of endpoints.
*
* @param connect_condition A function object that is called prior to each
* connection attempt. The signature of the function object must be:
- * @code Iterator connect_condition(
+ * @code bool connect_condition(
* const boost::system::error_code& ec,
- * Iterator next); @endcode
+ * const typename Protocol::endpoint& next); @endcode
* The @c ec parameter contains the result from the most recent connect
* operation. Before the first connection attempt, @c ec is always set to
- * indicate success. The @c next parameter is an iterator pointing to the next
- * endpoint to be tried. The function object should return the next iterator,
- * but is permitted to return a different iterator so that endpoints may be
- * skipped. The implementation guarantees that the function object will never
- * be called with the end iterator.
+ * indicate success. The @c next parameter is the next endpoint to be tried.
+ * The function object should return true if the next endpoint should be tried,
+ * and false if it should be skipped.
*
* @param ec Set to indicate what error occurred, if any. If the sequence is
* empty, set to boost::asio::error::not_found. Otherwise, contains the error
* from the last connection attempt.
*
- * @returns On success, an iterator denoting the successfully connected
- * endpoint. Otherwise, the end iterator.
- *
- * @note This overload assumes that a default constructed object of type @c
- * Iterator represents the end of the sequence. This is a valid assumption for
- * iterator types such as @c boost::asio::ip::tcp::resolver::iterator.
+ * @returns On success, the successfully connected endpoint. Otherwise, a
+ * default-constructed endpoint.
*
* @par Example
* The following connect condition function object can be used to output
* information about the individual connection attempts:
* @code struct my_connect_condition
* {
- * template <typename Iterator>
- * Iterator operator()(
+ * bool operator()(
* const boost::system::error_code& ec,
- * Iterator next)
+ * const::tcp::endpoint& next)
* {
* if (ec) std::cout << "Error: " << ec.message() << std::endl;
- * std::cout << "Trying: " << next->endpoint() << std::endl;
- * return next;
+ * std::cout << "Trying: " << next << std::endl;
+ * return true;
* }
* }; @endcode
* It would be used with the boost::asio::connect function as follows:
- * @code tcp::resolver r(io_service);
+ * @code tcp::resolver r(io_context);
* tcp::resolver::query q("host", "service");
- * tcp::socket s(io_service);
+ * tcp::socket s(io_context);
* boost::system::error_code ec;
- * tcp::resolver::iterator i = boost::asio::connect(
- * s, r.resolve(q), my_connect_condition(), ec);
+ * tcp::endpoint e = boost::asio::connect(s,
+ * r.resolve(q), my_connect_condition(), ec);
* if (ec)
* {
* // An error occurred.
* }
* else
* {
- * std::cout << "Connected to: " << i->endpoint() << std::endl;
+ * std::cout << "Connected to: " << e << std::endl;
* } @endcode
*/
-template <typename Protocol, typename SocketService,
+template <typename Protocol BOOST_ASIO_SVC_TPARAM,
+ typename EndpointSequence, typename ConnectCondition>
+typename Protocol::endpoint connect(
+ basic_socket<Protocol BOOST_ASIO_SVC_TARG>& s,
+ const EndpointSequence& endpoints, ConnectCondition connect_condition,
+ boost::system::error_code& ec,
+ typename enable_if<is_endpoint_sequence<
+ EndpointSequence>::value>::type* = 0);
+
+#if !defined(BOOST_ASIO_NO_DEPRECATED)
+/// (Deprecated.) Establishes a socket connection by trying each endpoint in a
+/// sequence.
+/**
+ * This function attempts to connect a socket to one of a sequence of
+ * endpoints. It does this by repeated calls to the socket's @c connect member
+ * function, once for each endpoint in the sequence, until a connection is
+ * successfully established.
+ *
+ * @param s The socket to be connected. If the socket is already open, it will
+ * be closed.
+ *
+ * @param begin An iterator pointing to the start of a sequence of endpoints.
+ *
+ * @param connect_condition A function object that is called prior to each
+ * connection attempt. The signature of the function object must be:
+ * @code bool connect_condition(
+ * const boost::system::error_code& ec,
+ * const typename Protocol::endpoint& next); @endcode
+ * The @c ec parameter contains the result from the most recent connect
+ * operation. Before the first connection attempt, @c ec is always set to
+ * indicate success. The @c next parameter is the next endpoint to be tried.
+ * The function object should return true if the next endpoint should be tried,
+ * and false if it should be skipped.
+ *
+ * @returns On success, an iterator denoting the successfully connected
+ * endpoint. Otherwise, the end iterator.
+ *
+ * @throws boost::system::system_error Thrown on failure. If the sequence is
+ * empty, the associated @c error_code is boost::asio::error::not_found.
+ * Otherwise, contains the error from the last connection attempt.
+ *
+ * @note This overload assumes that a default constructed object of type @c
+ * Iterator represents the end of the sequence. This is a valid assumption for
+ * iterator types such as @c boost::asio::ip::tcp::resolver::iterator.
+ */
+template <typename Protocol BOOST_ASIO_SVC_TPARAM,
typename Iterator, typename ConnectCondition>
-Iterator connect(basic_socket<Protocol, SocketService>& s, Iterator begin,
- ConnectCondition connect_condition, boost::system::error_code& ec);
+Iterator connect(basic_socket<Protocol BOOST_ASIO_SVC_TARG>& s,
+ Iterator begin, ConnectCondition connect_condition,
+ typename enable_if<!is_endpoint_sequence<Iterator>::value>::type* = 0);
+
+/// (Deprecated.) Establishes a socket connection by trying each endpoint in a
+/// sequence.
+/**
+ * This function attempts to connect a socket to one of a sequence of
+ * endpoints. It does this by repeated calls to the socket's @c connect member
+ * function, once for each endpoint in the sequence, until a connection is
+ * successfully established.
+ *
+ * @param s The socket to be connected. If the socket is already open, it will
+ * be closed.
+ *
+ * @param begin An iterator pointing to the start of a sequence of endpoints.
+ *
+ * @param connect_condition A function object that is called prior to each
+ * connection attempt. The signature of the function object must be:
+ * @code bool connect_condition(
+ * const boost::system::error_code& ec,
+ * const typename Protocol::endpoint& next); @endcode
+ * The @c ec parameter contains the result from the most recent connect
+ * operation. Before the first connection attempt, @c ec is always set to
+ * indicate success. The @c next parameter is the next endpoint to be tried.
+ * The function object should return true if the next endpoint should be tried,
+ * and false if it should be skipped.
+ *
+ * @param ec Set to indicate what error occurred, if any. If the sequence is
+ * empty, set to boost::asio::error::not_found. Otherwise, contains the error
+ * from the last connection attempt.
+ *
+ * @returns On success, an iterator denoting the successfully connected
+ * endpoint. Otherwise, the end iterator.
+ *
+ * @note This overload assumes that a default constructed object of type @c
+ * Iterator represents the end of the sequence. This is a valid assumption for
+ * iterator types such as @c boost::asio::ip::tcp::resolver::iterator.
+ */
+template <typename Protocol BOOST_ASIO_SVC_TPARAM,
+ typename Iterator, typename ConnectCondition>
+Iterator connect(basic_socket<Protocol BOOST_ASIO_SVC_TARG>& s, Iterator begin,
+ ConnectCondition connect_condition, boost::system::error_code& ec,
+ typename enable_if<!is_endpoint_sequence<Iterator>::value>::type* = 0);
+#endif // !defined(BOOST_ASIO_NO_DEPRECATED)
/// Establishes a socket connection by trying each endpoint in a sequence.
/**
@@ -323,19 +486,16 @@ Iterator connect(basic_socket<Protocol, SocketService>& s, Iterator begin,
*
* @param connect_condition A function object that is called prior to each
* connection attempt. The signature of the function object must be:
- * @code Iterator connect_condition(
+ * @code bool connect_condition(
* const boost::system::error_code& ec,
- * Iterator next); @endcode
+ * const typename Protocol::endpoint& next); @endcode
* The @c ec parameter contains the result from the most recent connect
* operation. Before the first connection attempt, @c ec is always set to
- * indicate success. The @c next parameter is an iterator pointing to the next
- * endpoint to be tried. The function object should return the next iterator,
- * but is permitted to return a different iterator so that endpoints may be
- * skipped. The implementation guarantees that the function object will never
- * be called with the end iterator.
+ * indicate success. The @c next parameter is the next endpoint to be tried.
+ * The function object should return true if the next endpoint should be tried,
+ * and false if it should be skipped.
*
- * @returns On success, an iterator denoting the successfully connected
- * endpoint. Otherwise, the end iterator.
+ * @returns An iterator denoting the successfully connected endpoint.
*
* @throws boost::system::system_error Thrown on failure. If the sequence is
* empty, the associated @c error_code is boost::asio::error::not_found.
@@ -346,27 +506,27 @@ Iterator connect(basic_socket<Protocol, SocketService>& s, Iterator begin,
* information about the individual connection attempts:
* @code struct my_connect_condition
* {
- * template <typename Iterator>
- * Iterator operator()(
+ * bool operator()(
* const boost::system::error_code& ec,
- * Iterator next)
+ * const::tcp::endpoint& next)
* {
* if (ec) std::cout << "Error: " << ec.message() << std::endl;
- * std::cout << "Trying: " << next->endpoint() << std::endl;
- * return next;
+ * std::cout << "Trying: " << next << std::endl;
+ * return true;
* }
* }; @endcode
* It would be used with the boost::asio::connect function as follows:
- * @code tcp::resolver r(io_service);
+ * @code tcp::resolver r(io_context);
* tcp::resolver::query q("host", "service");
- * tcp::resolver::iterator i = r.resolve(q), end;
- * tcp::socket s(io_service);
- * i = boost::asio::connect(s, i, end, my_connect_condition());
+ * tcp::resolver::results_type e = r.resolve(q);
+ * tcp::socket s(io_context);
+ * tcp::resolver::results_type::iterator i = boost::asio::connect(
+ * s, e.begin(), e.end(), my_connect_condition());
* std::cout << "Connected to: " << i->endpoint() << std::endl; @endcode
*/
-template <typename Protocol, typename SocketService,
+template <typename Protocol BOOST_ASIO_SVC_TPARAM,
typename Iterator, typename ConnectCondition>
-Iterator connect(basic_socket<Protocol, SocketService>& s, Iterator begin,
+Iterator connect(basic_socket<Protocol BOOST_ASIO_SVC_TARG>& s, Iterator begin,
Iterator end, ConnectCondition connect_condition);
/// Establishes a socket connection by trying each endpoint in a sequence.
@@ -385,16 +545,14 @@ Iterator connect(basic_socket<Protocol, SocketService>& s, Iterator begin,
*
* @param connect_condition A function object that is called prior to each
* connection attempt. The signature of the function object must be:
- * @code Iterator connect_condition(
+ * @code bool connect_condition(
* const boost::system::error_code& ec,
- * Iterator next); @endcode
+ * const typename Protocol::endpoint& next); @endcode
* The @c ec parameter contains the result from the most recent connect
* operation. Before the first connection attempt, @c ec is always set to
- * indicate success. The @c next parameter is an iterator pointing to the next
- * endpoint to be tried. The function object should return the next iterator,
- * but is permitted to return a different iterator so that endpoints may be
- * skipped. The implementation guarantees that the function object will never
- * be called with the end iterator.
+ * indicate success. The @c next parameter is the next endpoint to be tried.
+ * The function object should return true if the next endpoint should be tried,
+ * and false if it should be skipped.
*
* @param ec Set to indicate what error occurred, if any. If the sequence is
* empty, set to boost::asio::error::not_found. Otherwise, contains the error
@@ -408,23 +566,23 @@ Iterator connect(basic_socket<Protocol, SocketService>& s, Iterator begin,
* information about the individual connection attempts:
* @code struct my_connect_condition
* {
- * template <typename Iterator>
- * Iterator operator()(
+ * bool operator()(
* const boost::system::error_code& ec,
- * Iterator next)
+ * const::tcp::endpoint& next)
* {
* if (ec) std::cout << "Error: " << ec.message() << std::endl;
- * std::cout << "Trying: " << next->endpoint() << std::endl;
- * return next;
+ * std::cout << "Trying: " << next << std::endl;
+ * return true;
* }
* }; @endcode
* It would be used with the boost::asio::connect function as follows:
- * @code tcp::resolver r(io_service);
+ * @code tcp::resolver r(io_context);
* tcp::resolver::query q("host", "service");
- * tcp::resolver::iterator i = r.resolve(q), end;
- * tcp::socket s(io_service);
+ * tcp::resolver::results_type e = r.resolve(q);
+ * tcp::socket s(io_context);
* boost::system::error_code ec;
- * i = boost::asio::connect(s, i, end, my_connect_condition(), ec);
+ * tcp::resolver::results_type::iterator i = boost::asio::connect(
+ * s, e.begin(), e.end(), my_connect_condition());
* if (ec)
* {
* // An error occurred.
@@ -434,9 +592,9 @@ Iterator connect(basic_socket<Protocol, SocketService>& s, Iterator begin,
* std::cout << "Connected to: " << i->endpoint() << std::endl;
* } @endcode
*/
-template <typename Protocol, typename SocketService,
+template <typename Protocol BOOST_ASIO_SVC_TPARAM,
typename Iterator, typename ConnectCondition>
-Iterator connect(basic_socket<Protocol, SocketService>& s,
+Iterator connect(basic_socket<Protocol BOOST_ASIO_SVC_TARG>& s,
Iterator begin, Iterator end, ConnectCondition connect_condition,
boost::system::error_code& ec);
@@ -461,7 +619,7 @@ Iterator connect(basic_socket<Protocol, SocketService>& s,
* @param s The socket to be connected. If the socket is already open, it will
* be closed.
*
- * @param begin An iterator pointing to the start of a sequence of endpoints.
+ * @param endpoints A sequence of endpoints.
*
* @param handler The handler to be called when the connect operation
* completes. Copies will be made of the handler as required. The function
@@ -472,23 +630,19 @@ Iterator connect(basic_socket<Protocol, SocketService>& s,
* // error from the last connection attempt.
* const boost::system::error_code& error,
*
- * // On success, an iterator denoting the successfully
- * // connected endpoint. Otherwise, the end iterator.
- * Iterator iterator
+ * // On success, the successfully connected endpoint.
+ * // Otherwise, a default-constructed endpoint.
+ * const typename Protocol::endpoint& endpoint
* ); @endcode
* Regardless of whether the asynchronous operation completes immediately or
* not, the handler will not be invoked from within this function. Invocation
* of the handler will be performed in a manner equivalent to using
- * boost::asio::io_service::post().
- *
- * @note This overload assumes that a default constructed object of type @c
- * Iterator represents the end of the sequence. This is a valid assumption for
- * iterator types such as @c boost::asio::ip::tcp::resolver::iterator.
+ * boost::asio::io_context::post().
*
* @par Example
- * @code tcp::resolver r(io_service);
+ * @code tcp::resolver r(io_context);
* tcp::resolver::query q("host", "service");
- * tcp::socket s(io_service);
+ * tcp::socket s(io_context);
*
* // ...
*
@@ -498,11 +652,11 @@ Iterator connect(basic_socket<Protocol, SocketService>& s,
*
* void resolve_handler(
* const boost::system::error_code& ec,
- * tcp::resolver::iterator i)
+ * tcp::resolver::results_type results)
* {
* if (!ec)
* {
- * boost::asio::async_connect(s, i, connect_handler);
+ * boost::asio::async_connect(s, results, connect_handler);
* }
* }
*
@@ -510,17 +664,65 @@ Iterator connect(basic_socket<Protocol, SocketService>& s,
*
* void connect_handler(
* const boost::system::error_code& ec,
- * tcp::resolver::iterator i)
+ * const tcp::endpoint& endpoint)
* {
* // ...
* } @endcode
*/
-template <typename Protocol, typename SocketService,
- typename Iterator, typename ComposedConnectHandler>
-BOOST_ASIO_INITFN_RESULT_TYPE(ComposedConnectHandler,
+template <typename Protocol BOOST_ASIO_SVC_TPARAM,
+ typename EndpointSequence, typename RangeConnectHandler>
+BOOST_ASIO_INITFN_RESULT_TYPE(RangeConnectHandler,
+ void (boost::system::error_code, typename Protocol::endpoint))
+async_connect(basic_socket<Protocol BOOST_ASIO_SVC_TARG>& s,
+ const EndpointSequence& endpoints,
+ BOOST_ASIO_MOVE_ARG(RangeConnectHandler) handler,
+ typename enable_if<is_endpoint_sequence<
+ EndpointSequence>::value>::type* = 0);
+
+#if !defined(BOOST_ASIO_NO_DEPRECATED)
+/// (Deprecated.) Asynchronously establishes a socket connection by trying each
+/// endpoint in a sequence.
+/**
+ * This function attempts to connect a socket to one of a sequence of
+ * endpoints. It does this by repeated calls to the socket's @c async_connect
+ * member function, once for each endpoint in the sequence, until a connection
+ * is successfully established.
+ *
+ * @param s The socket to be connected. If the socket is already open, it will
+ * be closed.
+ *
+ * @param begin An iterator pointing to the start of a sequence of endpoints.
+ *
+ * @param handler The handler to be called when the connect operation
+ * completes. Copies will be made of the handler as required. The function
+ * signature of the handler must be:
+ * @code void handler(
+ * // Result of operation. if the sequence is empty, set to
+ * // boost::asio::error::not_found. Otherwise, contains the
+ * // error from the last connection attempt.
+ * const boost::system::error_code& error,
+ *
+ * // On success, an iterator denoting the successfully
+ * // connected endpoint. Otherwise, the end iterator.
+ * Iterator iterator
+ * ); @endcode
+ * Regardless of whether the asynchronous operation completes immediately or
+ * not, the handler will not be invoked from within this function. Invocation
+ * of the handler will be performed in a manner equivalent to using
+ * boost::asio::io_context::post().
+ *
+ * @note This overload assumes that a default constructed object of type @c
+ * Iterator represents the end of the sequence. This is a valid assumption for
+ * iterator types such as @c boost::asio::ip::tcp::resolver::iterator.
+ */
+template <typename Protocol BOOST_ASIO_SVC_TPARAM,
+ typename Iterator, typename IteratorConnectHandler>
+BOOST_ASIO_INITFN_RESULT_TYPE(IteratorConnectHandler,
void (boost::system::error_code, Iterator))
-async_connect(basic_socket<Protocol, SocketService>& s,
- Iterator begin, BOOST_ASIO_MOVE_ARG(ComposedConnectHandler) handler);
+async_connect(basic_socket<Protocol BOOST_ASIO_SVC_TARG>& s,
+ Iterator begin, BOOST_ASIO_MOVE_ARG(IteratorConnectHandler) handler,
+ typename enable_if<!is_endpoint_sequence<Iterator>::value>::type* = 0);
+#endif // !defined(BOOST_ASIO_NO_DEPRECATED)
/// Asynchronously establishes a socket connection by trying each endpoint in a
/// sequence.
@@ -553,46 +755,31 @@ async_connect(basic_socket<Protocol, SocketService>& s,
* Regardless of whether the asynchronous operation completes immediately or
* not, the handler will not be invoked from within this function. Invocation
* of the handler will be performed in a manner equivalent to using
- * boost::asio::io_service::post().
+ * boost::asio::io_context::post().
*
* @par Example
- * @code tcp::resolver r(io_service);
- * tcp::resolver::query q("host", "service");
- * tcp::socket s(io_service);
- *
- * // ...
- *
- * r.async_resolve(q, resolve_handler);
- *
- * // ...
- *
- * void resolve_handler(
- * const boost::system::error_code& ec,
- * tcp::resolver::iterator i)
- * {
- * if (!ec)
- * {
- * tcp::resolver::iterator end;
- * boost::asio::async_connect(s, i, end, connect_handler);
- * }
- * }
+ * @code std::vector<tcp::endpoint> endpoints = ...;
+ * tcp::socket s(io_context);
+ * boost::asio::async_connect(s,
+ * endpoints.begin(), endpoints.end(),
+ * connect_handler);
*
* // ...
*
* void connect_handler(
* const boost::system::error_code& ec,
- * tcp::resolver::iterator i)
+ * std::vector<tcp::endpoint>::iterator i)
* {
* // ...
* } @endcode
*/
-template <typename Protocol, typename SocketService,
- typename Iterator, typename ComposedConnectHandler>
-BOOST_ASIO_INITFN_RESULT_TYPE(ComposedConnectHandler,
+template <typename Protocol BOOST_ASIO_SVC_TPARAM,
+ typename Iterator, typename IteratorConnectHandler>
+BOOST_ASIO_INITFN_RESULT_TYPE(IteratorConnectHandler,
void (boost::system::error_code, Iterator))
-async_connect(basic_socket<Protocol, SocketService>& s,
+async_connect(basic_socket<Protocol BOOST_ASIO_SVC_TARG>& s,
Iterator begin, Iterator end,
- BOOST_ASIO_MOVE_ARG(ComposedConnectHandler) handler);
+ BOOST_ASIO_MOVE_ARG(IteratorConnectHandler) handler);
/// Asynchronously establishes a socket connection by trying each endpoint in a
/// sequence.
@@ -605,20 +792,18 @@ async_connect(basic_socket<Protocol, SocketService>& s,
* @param s The socket to be connected. If the socket is already open, it will
* be closed.
*
- * @param begin An iterator pointing to the start of a sequence of endpoints.
+ * @param endpoints A sequence of endpoints.
*
* @param connect_condition A function object that is called prior to each
* connection attempt. The signature of the function object must be:
- * @code Iterator connect_condition(
+ * @code bool connect_condition(
* const boost::system::error_code& ec,
- * Iterator next); @endcode
+ * const typename Protocol::endpoint& next); @endcode
* The @c ec parameter contains the result from the most recent connect
* operation. Before the first connection attempt, @c ec is always set to
- * indicate success. The @c next parameter is an iterator pointing to the next
- * endpoint to be tried. The function object should return the next iterator,
- * but is permitted to return a different iterator so that endpoints may be
- * skipped. The implementation guarantees that the function object will never
- * be called with the end iterator.
+ * indicate success. The @c next parameter is the next endpoint to be tried.
+ * The function object should return true if the next endpoint should be tried,
+ * and false if it should be skipped.
*
* @param handler The handler to be called when the connect operation
* completes. Copies will be made of the handler as required. The function
@@ -636,31 +821,26 @@ async_connect(basic_socket<Protocol, SocketService>& s,
* Regardless of whether the asynchronous operation completes immediately or
* not, the handler will not be invoked from within this function. Invocation
* of the handler will be performed in a manner equivalent to using
- * boost::asio::io_service::post().
- *
- * @note This overload assumes that a default constructed object of type @c
- * Iterator represents the end of the sequence. This is a valid assumption for
- * iterator types such as @c boost::asio::ip::tcp::resolver::iterator.
+ * boost::asio::io_context::post().
*
* @par Example
* The following connect condition function object can be used to output
* information about the individual connection attempts:
* @code struct my_connect_condition
* {
- * template <typename Iterator>
- * Iterator operator()(
+ * bool operator()(
* const boost::system::error_code& ec,
- * Iterator next)
+ * const::tcp::endpoint& next)
* {
* if (ec) std::cout << "Error: " << ec.message() << std::endl;
- * std::cout << "Trying: " << next->endpoint() << std::endl;
- * return next;
+ * std::cout << "Trying: " << next << std::endl;
+ * return true;
* }
* }; @endcode
* It would be used with the boost::asio::connect function as follows:
- * @code tcp::resolver r(io_service);
+ * @code tcp::resolver r(io_context);
* tcp::resolver::query q("host", "service");
- * tcp::socket s(io_service);
+ * tcp::socket s(io_context);
*
* // ...
*
@@ -670,11 +850,11 @@ async_connect(basic_socket<Protocol, SocketService>& s,
*
* void resolve_handler(
* const boost::system::error_code& ec,
- * tcp::resolver::iterator i)
+ * tcp::resolver::results_type results)
* {
* if (!ec)
* {
- * boost::asio::async_connect(s, i,
+ * boost::asio::async_connect(s, results,
* my_connect_condition(),
* connect_handler);
* }
@@ -684,7 +864,7 @@ async_connect(basic_socket<Protocol, SocketService>& s,
*
* void connect_handler(
* const boost::system::error_code& ec,
- * tcp::resolver::iterator i)
+ * const tcp::endpoint& endpoint)
* {
* if (ec)
* {
@@ -692,17 +872,76 @@ async_connect(basic_socket<Protocol, SocketService>& s,
* }
* else
* {
- * std::cout << "Connected to: " << i->endpoint() << std::endl;
+ * std::cout << "Connected to: " << endpoint << std::endl;
* }
* } @endcode
*/
-template <typename Protocol, typename SocketService, typename Iterator,
- typename ConnectCondition, typename ComposedConnectHandler>
-BOOST_ASIO_INITFN_RESULT_TYPE(ComposedConnectHandler,
+template <typename Protocol BOOST_ASIO_SVC_TPARAM, typename EndpointSequence,
+ typename ConnectCondition, typename RangeConnectHandler>
+BOOST_ASIO_INITFN_RESULT_TYPE(RangeConnectHandler,
+ void (boost::system::error_code, typename Protocol::endpoint))
+async_connect(basic_socket<Protocol BOOST_ASIO_SVC_TARG>& s,
+ const EndpointSequence& endpoints, ConnectCondition connect_condition,
+ BOOST_ASIO_MOVE_ARG(RangeConnectHandler) handler,
+ typename enable_if<is_endpoint_sequence<
+ EndpointSequence>::value>::type* = 0);
+
+#if !defined(BOOST_ASIO_NO_DEPRECATED)
+/// (Deprecated.) Asynchronously establishes a socket connection by trying each
+/// endpoint in a sequence.
+/**
+ * This function attempts to connect a socket to one of a sequence of
+ * endpoints. It does this by repeated calls to the socket's @c async_connect
+ * member function, once for each endpoint in the sequence, until a connection
+ * is successfully established.
+ *
+ * @param s The socket to be connected. If the socket is already open, it will
+ * be closed.
+ *
+ * @param begin An iterator pointing to the start of a sequence of endpoints.
+ *
+ * @param connect_condition A function object that is called prior to each
+ * connection attempt. The signature of the function object must be:
+ * @code bool connect_condition(
+ * const boost::system::error_code& ec,
+ * const typename Protocol::endpoint& next); @endcode
+ * The @c ec parameter contains the result from the most recent connect
+ * operation. Before the first connection attempt, @c ec is always set to
+ * indicate success. The @c next parameter is the next endpoint to be tried.
+ * The function object should return true if the next endpoint should be tried,
+ * and false if it should be skipped.
+ *
+ * @param handler The handler to be called when the connect operation
+ * completes. Copies will be made of the handler as required. The function
+ * signature of the handler must be:
+ * @code void handler(
+ * // Result of operation. if the sequence is empty, set to
+ * // boost::asio::error::not_found. Otherwise, contains the
+ * // error from the last connection attempt.
+ * const boost::system::error_code& error,
+ *
+ * // On success, an iterator denoting the successfully
+ * // connected endpoint. Otherwise, the end iterator.
+ * Iterator iterator
+ * ); @endcode
+ * Regardless of whether the asynchronous operation completes immediately or
+ * not, the handler will not be invoked from within this function. Invocation
+ * of the handler will be performed in a manner equivalent to using
+ * boost::asio::io_context::post().
+ *
+ * @note This overload assumes that a default constructed object of type @c
+ * Iterator represents the end of the sequence. This is a valid assumption for
+ * iterator types such as @c boost::asio::ip::tcp::resolver::iterator.
+ */
+template <typename Protocol BOOST_ASIO_SVC_TPARAM, typename Iterator,
+ typename ConnectCondition, typename IteratorConnectHandler>
+BOOST_ASIO_INITFN_RESULT_TYPE(IteratorConnectHandler,
void (boost::system::error_code, Iterator))
-async_connect(basic_socket<Protocol, SocketService>& s, Iterator begin,
+async_connect(basic_socket<Protocol BOOST_ASIO_SVC_TARG>& s, Iterator begin,
ConnectCondition connect_condition,
- BOOST_ASIO_MOVE_ARG(ComposedConnectHandler) handler);
+ BOOST_ASIO_MOVE_ARG(IteratorConnectHandler) handler,
+ typename enable_if<!is_endpoint_sequence<Iterator>::value>::type* = 0);
+#endif // !defined(BOOST_ASIO_NO_DEPRECATED)
/// Asynchronously establishes a socket connection by trying each endpoint in a
/// sequence.
@@ -721,16 +960,14 @@ async_connect(basic_socket<Protocol, SocketService>& s, Iterator begin,
*
* @param connect_condition A function object that is called prior to each
* connection attempt. The signature of the function object must be:
- * @code Iterator connect_condition(
+ * @code bool connect_condition(
* const boost::system::error_code& ec,
- * Iterator next); @endcode
+ * const typename Protocol::endpoint& next); @endcode
* The @c ec parameter contains the result from the most recent connect
* operation. Before the first connection attempt, @c ec is always set to
- * indicate success. The @c next parameter is an iterator pointing to the next
- * endpoint to be tried. The function object should return the next iterator,
- * but is permitted to return a different iterator so that endpoints may be
- * skipped. The implementation guarantees that the function object will never
- * be called with the end iterator.
+ * indicate success. The @c next parameter is the next endpoint to be tried.
+ * The function object should return true if the next endpoint should be tried,
+ * and false if it should be skipped.
*
* @param handler The handler to be called when the connect operation
* completes. Copies will be made of the handler as required. The function
@@ -748,27 +985,26 @@ async_connect(basic_socket<Protocol, SocketService>& s, Iterator begin,
* Regardless of whether the asynchronous operation completes immediately or
* not, the handler will not be invoked from within this function. Invocation
* of the handler will be performed in a manner equivalent to using
- * boost::asio::io_service::post().
+ * boost::asio::io_context::post().
*
* @par Example
* The following connect condition function object can be used to output
* information about the individual connection attempts:
* @code struct my_connect_condition
* {
- * template <typename Iterator>
- * Iterator operator()(
+ * bool operator()(
* const boost::system::error_code& ec,
- * Iterator next)
+ * const::tcp::endpoint& next)
* {
* if (ec) std::cout << "Error: " << ec.message() << std::endl;
- * std::cout << "Trying: " << next->endpoint() << std::endl;
- * return next;
+ * std::cout << "Trying: " << next << std::endl;
+ * return true;
* }
* }; @endcode
* It would be used with the boost::asio::connect function as follows:
- * @code tcp::resolver r(io_service);
+ * @code tcp::resolver r(io_context);
* tcp::resolver::query q("host", "service");
- * tcp::socket s(io_service);
+ * tcp::socket s(io_context);
*
* // ...
*
@@ -805,13 +1041,13 @@ async_connect(basic_socket<Protocol, SocketService>& s, Iterator begin,
* }
* } @endcode
*/
-template <typename Protocol, typename SocketService, typename Iterator,
- typename ConnectCondition, typename ComposedConnectHandler>
-BOOST_ASIO_INITFN_RESULT_TYPE(ComposedConnectHandler,
+template <typename Protocol BOOST_ASIO_SVC_TPARAM, typename Iterator,
+ typename ConnectCondition, typename IteratorConnectHandler>
+BOOST_ASIO_INITFN_RESULT_TYPE(IteratorConnectHandler,
void (boost::system::error_code, Iterator))
-async_connect(basic_socket<Protocol, SocketService>& s,
+async_connect(basic_socket<Protocol BOOST_ASIO_SVC_TARG>& s,
Iterator begin, Iterator end, ConnectCondition connect_condition,
- BOOST_ASIO_MOVE_ARG(ComposedConnectHandler) handler);
+ BOOST_ASIO_MOVE_ARG(IteratorConnectHandler) handler);
/*@}*/