Imported Upstream version 1.72.0
[platform/upstream/boost.git] / boost / asio / connect.hpp
1 //
2 // connect.hpp
3 // ~~~~~~~~~~~
4 //
5 // Copyright (c) 2003-2019 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 BOOST_ASIO_CONNECT_HPP
12 #define BOOST_ASIO_CONNECT_HPP
13
14 #if defined(_MSC_VER) && (_MSC_VER >= 1200)
15 # pragma once
16 #endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
17
18 #include <boost/asio/detail/config.hpp>
19 #include <boost/asio/async_result.hpp>
20 #include <boost/asio/basic_socket.hpp>
21 #include <boost/asio/detail/type_traits.hpp>
22 #include <boost/asio/error.hpp>
23
24 #include <boost/asio/detail/push_options.hpp>
25
26 namespace boost {
27 namespace asio {
28
29 namespace detail
30 {
31   char (&has_iterator_helper(...))[2];
32
33   template <typename T>
34   char has_iterator_helper(T*, typename T::iterator* = 0);
35
36   template <typename T>
37   struct has_iterator_typedef
38   {
39     enum { value = (sizeof((has_iterator_helper)((T*)(0))) == 1) };
40   };
41 } // namespace detail
42
43 /// Type trait used to determine whether a type is an endpoint sequence that can
44 /// be used with with @c connect and @c async_connect.
45 template <typename T>
46 struct is_endpoint_sequence
47 {
48 #if defined(GENERATING_DOCUMENTATION)
49   /// The value member is true if the type may be used as an endpoint sequence.
50   static const bool value;
51 #else
52   enum
53   {
54     value = detail::has_iterator_typedef<T>::value
55   };
56 #endif
57 };
58
59 /**
60  * @defgroup connect boost::asio::connect
61  *
62  * @brief The @c connect function is a composed operation that establishes a
63  * socket connection by trying each endpoint in a sequence.
64  */
65 /*@{*/
66
67 /// Establishes a socket connection by trying each endpoint in a sequence.
68 /**
69  * This function attempts to connect a socket to one of a sequence of
70  * endpoints. It does this by repeated calls to the socket's @c connect member
71  * function, once for each endpoint in the sequence, until a connection is
72  * successfully established.
73  *
74  * @param s The socket to be connected. If the socket is already open, it will
75  * be closed.
76  *
77  * @param endpoints A sequence of endpoints.
78  *
79  * @returns The successfully connected endpoint.
80  *
81  * @throws boost::system::system_error Thrown on failure. If the sequence is
82  * empty, the associated @c error_code is boost::asio::error::not_found.
83  * Otherwise, contains the error from the last connection attempt.
84  *
85  * @par Example
86  * @code tcp::resolver r(my_context);
87  * tcp::resolver::query q("host", "service");
88  * tcp::socket s(my_context);
89  * boost::asio::connect(s, r.resolve(q)); @endcode
90  */
91 template <typename Protocol, typename Executor, typename EndpointSequence>
92 typename Protocol::endpoint connect(basic_socket<Protocol, Executor>& s,
93     const EndpointSequence& endpoints,
94     typename enable_if<is_endpoint_sequence<
95         EndpointSequence>::value>::type* = 0);
96
97 /// Establishes a socket connection by trying each endpoint in a sequence.
98 /**
99  * This function attempts to connect a socket to one of a sequence of
100  * endpoints. It does this by repeated calls to the socket's @c connect member
101  * function, once for each endpoint in the sequence, until a connection is
102  * successfully established.
103  *
104  * @param s The socket to be connected. If the socket is already open, it will
105  * be closed.
106  *
107  * @param endpoints A sequence of endpoints.
108  *
109  * @param ec Set to indicate what error occurred, if any. If the sequence is
110  * empty, set to boost::asio::error::not_found. Otherwise, contains the error
111  * from the last connection attempt.
112  *
113  * @returns On success, the successfully connected endpoint. Otherwise, a
114  * default-constructed endpoint.
115  *
116  * @par Example
117  * @code tcp::resolver r(my_context);
118  * tcp::resolver::query q("host", "service");
119  * tcp::socket s(my_context);
120  * boost::system::error_code ec;
121  * boost::asio::connect(s, r.resolve(q), ec);
122  * if (ec)
123  * {
124  *   // An error occurred.
125  * } @endcode
126  */
127 template <typename Protocol, typename Executor, typename EndpointSequence>
128 typename Protocol::endpoint connect(basic_socket<Protocol, Executor>& s,
129     const EndpointSequence& endpoints, boost::system::error_code& ec,
130     typename enable_if<is_endpoint_sequence<
131         EndpointSequence>::value>::type* = 0);
132
133 #if !defined(BOOST_ASIO_NO_DEPRECATED)
134 /// (Deprecated: Use range overload.) Establishes a socket connection by trying
135 /// each endpoint in a sequence.
136 /**
137  * This function attempts to connect a socket to one of a sequence of
138  * endpoints. It does this by repeated calls to the socket's @c connect member
139  * function, once for each endpoint in the sequence, until a connection is
140  * successfully established.
141  *
142  * @param s The socket to be connected. If the socket is already open, it will
143  * be closed.
144  *
145  * @param begin An iterator pointing to the start of a sequence of endpoints.
146  *
147  * @returns On success, an iterator denoting the successfully connected
148  * endpoint. Otherwise, the end iterator.
149  *
150  * @throws boost::system::system_error Thrown on failure. If the sequence is
151  * empty, the associated @c error_code is boost::asio::error::not_found.
152  * Otherwise, contains the error from the last connection attempt.
153  *
154  * @note This overload assumes that a default constructed object of type @c
155  * Iterator represents the end of the sequence. This is a valid assumption for
156  * iterator types such as @c boost::asio::ip::tcp::resolver::iterator.
157  */
158 template <typename Protocol, typename Executor, typename Iterator>
159 Iterator connect(basic_socket<Protocol, Executor>& s, Iterator begin,
160     typename enable_if<!is_endpoint_sequence<Iterator>::value>::type* = 0);
161
162 /// (Deprecated: Use range overload.) Establishes a socket connection by trying
163 /// each endpoint in a sequence.
164 /**
165  * This function attempts to connect a socket to one of a sequence of
166  * endpoints. It does this by repeated calls to the socket's @c connect member
167  * function, once for each endpoint in the sequence, until a connection is
168  * successfully established.
169  *
170  * @param s The socket to be connected. If the socket is already open, it will
171  * be closed.
172  *
173  * @param begin An iterator pointing to the start of a sequence of endpoints.
174  *
175  * @param ec Set to indicate what error occurred, if any. If the sequence is
176  * empty, set to boost::asio::error::not_found. Otherwise, contains the error
177  * from the last connection attempt.
178  *
179  * @returns On success, an iterator denoting the successfully connected
180  * endpoint. Otherwise, the end iterator.
181  *
182  * @note This overload assumes that a default constructed object of type @c
183  * Iterator represents the end of the sequence. This is a valid assumption for
184  * iterator types such as @c boost::asio::ip::tcp::resolver::iterator.
185  */
186 template <typename Protocol, typename Executor, typename Iterator>
187 Iterator connect(basic_socket<Protocol, Executor>& s,
188     Iterator begin, boost::system::error_code& ec,
189     typename enable_if<!is_endpoint_sequence<Iterator>::value>::type* = 0);
190 #endif // !defined(BOOST_ASIO_NO_DEPRECATED)
191
192 /// Establishes a socket connection by trying each endpoint in a sequence.
193 /**
194  * This function attempts to connect a socket to one of a sequence of
195  * endpoints. It does this by repeated calls to the socket's @c connect member
196  * function, once for each endpoint in the sequence, until a connection is
197  * successfully established.
198  *
199  * @param s The socket to be connected. If the socket is already open, it will
200  * be closed.
201  *
202  * @param begin An iterator pointing to the start of a sequence of endpoints.
203  *
204  * @param end An iterator pointing to the end of a sequence of endpoints.
205  *
206  * @returns An iterator denoting the successfully connected endpoint.
207  *
208  * @throws boost::system::system_error Thrown on failure. If the sequence is
209  * empty, the associated @c error_code is boost::asio::error::not_found.
210  * Otherwise, contains the error from the last connection attempt.
211  *
212  * @par Example
213  * @code tcp::resolver r(my_context);
214  * tcp::resolver::query q("host", "service");
215  * tcp::resolver::results_type e = r.resolve(q);
216  * tcp::socket s(my_context);
217  * boost::asio::connect(s, e.begin(), e.end()); @endcode
218  */
219 template <typename Protocol, typename Executor, typename Iterator>
220 Iterator connect(basic_socket<Protocol, Executor>& s,
221     Iterator begin, Iterator end);
222
223 /// Establishes a socket connection by trying each endpoint in a sequence.
224 /**
225  * This function attempts to connect a socket to one of a sequence of
226  * endpoints. It does this by repeated calls to the socket's @c connect member
227  * function, once for each endpoint in the sequence, until a connection is
228  * successfully established.
229  *
230  * @param s The socket to be connected. If the socket is already open, it will
231  * be closed.
232  *
233  * @param begin An iterator pointing to the start of a sequence of endpoints.
234  *
235  * @param end An iterator pointing to the end of a sequence of endpoints.
236  *
237  * @param ec Set to indicate what error occurred, if any. If the sequence is
238  * empty, set to boost::asio::error::not_found. Otherwise, contains the error
239  * from the last connection attempt.
240  *
241  * @returns On success, an iterator denoting the successfully connected
242  * endpoint. Otherwise, the end iterator.
243  *
244  * @par Example
245  * @code tcp::resolver r(my_context);
246  * tcp::resolver::query q("host", "service");
247  * tcp::resolver::results_type e = r.resolve(q);
248  * tcp::socket s(my_context);
249  * boost::system::error_code ec;
250  * boost::asio::connect(s, e.begin(), e.end(), ec);
251  * if (ec)
252  * {
253  *   // An error occurred.
254  * } @endcode
255  */
256 template <typename Protocol, typename Executor, typename Iterator>
257 Iterator connect(basic_socket<Protocol, Executor>& s,
258     Iterator begin, Iterator end, boost::system::error_code& ec);
259
260 /// Establishes a socket connection by trying each endpoint in a sequence.
261 /**
262  * This function attempts to connect a socket to one of a sequence of
263  * endpoints. It does this by repeated calls to the socket's @c connect member
264  * function, once for each endpoint in the sequence, until a connection is
265  * successfully established.
266  *
267  * @param s The socket to be connected. If the socket is already open, it will
268  * be closed.
269  *
270  * @param endpoints A sequence of endpoints.
271  *
272  * @param connect_condition A function object that is called prior to each
273  * connection attempt. The signature of the function object must be:
274  * @code bool connect_condition(
275  *     const boost::system::error_code& ec,
276  *     const typename Protocol::endpoint& next); @endcode
277  * The @c ec parameter contains the result from the most recent connect
278  * operation. Before the first connection attempt, @c ec is always set to
279  * indicate success. The @c next parameter is the next endpoint to be tried.
280  * The function object should return true if the next endpoint should be tried,
281  * and false if it should be skipped.
282  *
283  * @returns The successfully connected endpoint.
284  *
285  * @throws boost::system::system_error Thrown on failure. If the sequence is
286  * empty, the associated @c error_code is boost::asio::error::not_found.
287  * Otherwise, contains the error from the last connection attempt.
288  *
289  * @par Example
290  * The following connect condition function object can be used to output
291  * information about the individual connection attempts:
292  * @code struct my_connect_condition
293  * {
294  *   bool operator()(
295  *       const boost::system::error_code& ec,
296  *       const::tcp::endpoint& next)
297  *   {
298  *     if (ec) std::cout << "Error: " << ec.message() << std::endl;
299  *     std::cout << "Trying: " << next << std::endl;
300  *     return true;
301  *   }
302  * }; @endcode
303  * It would be used with the boost::asio::connect function as follows:
304  * @code tcp::resolver r(my_context);
305  * tcp::resolver::query q("host", "service");
306  * tcp::socket s(my_context);
307  * tcp::endpoint e = boost::asio::connect(s,
308  *     r.resolve(q), my_connect_condition());
309  * std::cout << "Connected to: " << e << std::endl; @endcode
310  */
311 template <typename Protocol, typename Executor,
312     typename EndpointSequence, typename ConnectCondition>
313 typename Protocol::endpoint connect(basic_socket<Protocol, Executor>& s,
314     const EndpointSequence& endpoints, ConnectCondition connect_condition,
315     typename enable_if<is_endpoint_sequence<
316         EndpointSequence>::value>::type* = 0);
317
318 /// Establishes a socket connection by trying each endpoint in a sequence.
319 /**
320  * This function attempts to connect a socket to one of a sequence of
321  * endpoints. It does this by repeated calls to the socket's @c connect member
322  * function, once for each endpoint in the sequence, until a connection is
323  * successfully established.
324  *
325  * @param s The socket to be connected. If the socket is already open, it will
326  * be closed.
327  *
328  * @param endpoints A sequence of endpoints.
329  *
330  * @param connect_condition A function object that is called prior to each
331  * connection attempt. The signature of the function object must be:
332  * @code bool connect_condition(
333  *     const boost::system::error_code& ec,
334  *     const typename Protocol::endpoint& next); @endcode
335  * The @c ec parameter contains the result from the most recent connect
336  * operation. Before the first connection attempt, @c ec is always set to
337  * indicate success. The @c next parameter is the next endpoint to be tried.
338  * The function object should return true if the next endpoint should be tried,
339  * and false if it should be skipped.
340  *
341  * @param ec Set to indicate what error occurred, if any. If the sequence is
342  * empty, set to boost::asio::error::not_found. Otherwise, contains the error
343  * from the last connection attempt.
344  *
345  * @returns On success, the successfully connected endpoint. Otherwise, a
346  * default-constructed endpoint.
347  *
348  * @par Example
349  * The following connect condition function object can be used to output
350  * information about the individual connection attempts:
351  * @code struct my_connect_condition
352  * {
353  *   bool operator()(
354  *       const boost::system::error_code& ec,
355  *       const::tcp::endpoint& next)
356  *   {
357  *     if (ec) std::cout << "Error: " << ec.message() << std::endl;
358  *     std::cout << "Trying: " << next << std::endl;
359  *     return true;
360  *   }
361  * }; @endcode
362  * It would be used with the boost::asio::connect function as follows:
363  * @code tcp::resolver r(my_context);
364  * tcp::resolver::query q("host", "service");
365  * tcp::socket s(my_context);
366  * boost::system::error_code ec;
367  * tcp::endpoint e = boost::asio::connect(s,
368  *     r.resolve(q), my_connect_condition(), ec);
369  * if (ec)
370  * {
371  *   // An error occurred.
372  * }
373  * else
374  * {
375  *   std::cout << "Connected to: " << e << std::endl;
376  * } @endcode
377  */
378 template <typename Protocol, typename Executor,
379     typename EndpointSequence, typename ConnectCondition>
380 typename Protocol::endpoint connect(basic_socket<Protocol, Executor>& s,
381     const EndpointSequence& endpoints, ConnectCondition connect_condition,
382     boost::system::error_code& ec,
383     typename enable_if<is_endpoint_sequence<
384         EndpointSequence>::value>::type* = 0);
385
386 #if !defined(BOOST_ASIO_NO_DEPRECATED)
387 /// (Deprecated: Use range overload.) Establishes a socket connection by trying
388 /// each endpoint in a sequence.
389 /**
390  * This function attempts to connect a socket to one of a sequence of
391  * endpoints. It does this by repeated calls to the socket's @c connect member
392  * function, once for each endpoint in the sequence, until a connection is
393  * successfully established.
394  *
395  * @param s The socket to be connected. If the socket is already open, it will
396  * be closed.
397  *
398  * @param begin An iterator pointing to the start of a sequence of endpoints.
399  *
400  * @param connect_condition A function object that is called prior to each
401  * connection attempt. The signature of the function object must be:
402  * @code bool connect_condition(
403  *     const boost::system::error_code& ec,
404  *     const typename Protocol::endpoint& next); @endcode
405  * The @c ec parameter contains the result from the most recent connect
406  * operation. Before the first connection attempt, @c ec is always set to
407  * indicate success. The @c next parameter is the next endpoint to be tried.
408  * The function object should return true if the next endpoint should be tried,
409  * and false if it should be skipped.
410  *
411  * @returns On success, an iterator denoting the successfully connected
412  * endpoint. Otherwise, the end iterator.
413  *
414  * @throws boost::system::system_error Thrown on failure. If the sequence is
415  * empty, the associated @c error_code is boost::asio::error::not_found.
416  * Otherwise, contains the error from the last connection attempt.
417  *
418  * @note This overload assumes that a default constructed object of type @c
419  * Iterator represents the end of the sequence. This is a valid assumption for
420  * iterator types such as @c boost::asio::ip::tcp::resolver::iterator.
421  */
422 template <typename Protocol, typename Executor,
423     typename Iterator, typename ConnectCondition>
424 Iterator connect(basic_socket<Protocol, Executor>& s,
425     Iterator begin, ConnectCondition connect_condition,
426     typename enable_if<!is_endpoint_sequence<Iterator>::value>::type* = 0);
427
428 /// (Deprecated: Use range overload.) Establishes a socket connection by trying
429 /// each endpoint in a sequence.
430 /**
431  * This function attempts to connect a socket to one of a sequence of
432  * endpoints. It does this by repeated calls to the socket's @c connect member
433  * function, once for each endpoint in the sequence, until a connection is
434  * successfully established.
435  *
436  * @param s The socket to be connected. If the socket is already open, it will
437  * be closed.
438  *
439  * @param begin An iterator pointing to the start of a sequence of endpoints.
440  *
441  * @param connect_condition A function object that is called prior to each
442  * connection attempt. The signature of the function object must be:
443  * @code bool connect_condition(
444  *     const boost::system::error_code& ec,
445  *     const typename Protocol::endpoint& next); @endcode
446  * The @c ec parameter contains the result from the most recent connect
447  * operation. Before the first connection attempt, @c ec is always set to
448  * indicate success. The @c next parameter is the next endpoint to be tried.
449  * The function object should return true if the next endpoint should be tried,
450  * and false if it should be skipped.
451  *
452  * @param ec Set to indicate what error occurred, if any. If the sequence is
453  * empty, set to boost::asio::error::not_found. Otherwise, contains the error
454  * from the last connection attempt.
455  *
456  * @returns On success, an iterator denoting the successfully connected
457  * endpoint. Otherwise, the end iterator.
458  *
459  * @note This overload assumes that a default constructed object of type @c
460  * Iterator represents the end of the sequence. This is a valid assumption for
461  * iterator types such as @c boost::asio::ip::tcp::resolver::iterator.
462  */
463 template <typename Protocol, typename Executor,
464     typename Iterator, typename ConnectCondition>
465 Iterator connect(basic_socket<Protocol, Executor>& s, Iterator begin,
466     ConnectCondition connect_condition, boost::system::error_code& ec,
467     typename enable_if<!is_endpoint_sequence<Iterator>::value>::type* = 0);
468 #endif // !defined(BOOST_ASIO_NO_DEPRECATED)
469
470 /// Establishes a socket connection by trying each endpoint in a sequence.
471 /**
472  * This function attempts to connect a socket to one of a sequence of
473  * endpoints. It does this by repeated calls to the socket's @c connect member
474  * function, once for each endpoint in the sequence, until a connection is
475  * successfully established.
476  *
477  * @param s The socket to be connected. If the socket is already open, it will
478  * be closed.
479  *
480  * @param begin An iterator pointing to the start of a sequence of endpoints.
481  *
482  * @param end An iterator pointing to the end of a sequence of endpoints.
483  *
484  * @param connect_condition A function object that is called prior to each
485  * connection attempt. The signature of the function object must be:
486  * @code bool connect_condition(
487  *     const boost::system::error_code& ec,
488  *     const typename Protocol::endpoint& next); @endcode
489  * The @c ec parameter contains the result from the most recent connect
490  * operation. Before the first connection attempt, @c ec is always set to
491  * indicate success. The @c next parameter is the next endpoint to be tried.
492  * The function object should return true if the next endpoint should be tried,
493  * and false if it should be skipped.
494  *
495  * @returns An iterator denoting the successfully connected endpoint.
496  *
497  * @throws boost::system::system_error Thrown on failure. If the sequence is
498  * empty, the associated @c error_code is boost::asio::error::not_found.
499  * Otherwise, contains the error from the last connection attempt.
500  *
501  * @par Example
502  * The following connect condition function object can be used to output
503  * information about the individual connection attempts:
504  * @code struct my_connect_condition
505  * {
506  *   bool operator()(
507  *       const boost::system::error_code& ec,
508  *       const::tcp::endpoint& next)
509  *   {
510  *     if (ec) std::cout << "Error: " << ec.message() << std::endl;
511  *     std::cout << "Trying: " << next << std::endl;
512  *     return true;
513  *   }
514  * }; @endcode
515  * It would be used with the boost::asio::connect function as follows:
516  * @code tcp::resolver r(my_context);
517  * tcp::resolver::query q("host", "service");
518  * tcp::resolver::results_type e = r.resolve(q);
519  * tcp::socket s(my_context);
520  * tcp::resolver::results_type::iterator i = boost::asio::connect(
521  *     s, e.begin(), e.end(), my_connect_condition());
522  * std::cout << "Connected to: " << i->endpoint() << std::endl; @endcode
523  */
524 template <typename Protocol, typename Executor,
525     typename Iterator, typename ConnectCondition>
526 Iterator connect(basic_socket<Protocol, Executor>& s, Iterator begin,
527     Iterator end, ConnectCondition connect_condition);
528
529 /// Establishes a socket connection by trying each endpoint in a sequence.
530 /**
531  * This function attempts to connect a socket to one of a sequence of
532  * endpoints. It does this by repeated calls to the socket's @c connect member
533  * function, once for each endpoint in the sequence, until a connection is
534  * successfully established.
535  *
536  * @param s The socket to be connected. If the socket is already open, it will
537  * be closed.
538  *
539  * @param begin An iterator pointing to the start of a sequence of endpoints.
540  *
541  * @param end An iterator pointing to the end of a sequence of endpoints.
542  *
543  * @param connect_condition A function object that is called prior to each
544  * connection attempt. The signature of the function object must be:
545  * @code bool connect_condition(
546  *     const boost::system::error_code& ec,
547  *     const typename Protocol::endpoint& next); @endcode
548  * The @c ec parameter contains the result from the most recent connect
549  * operation. Before the first connection attempt, @c ec is always set to
550  * indicate success. The @c next parameter is the next endpoint to be tried.
551  * The function object should return true if the next endpoint should be tried,
552  * and false if it should be skipped.
553  *
554  * @param ec Set to indicate what error occurred, if any. If the sequence is
555  * empty, set to boost::asio::error::not_found. Otherwise, contains the error
556  * from the last connection attempt.
557  *
558  * @returns On success, an iterator denoting the successfully connected
559  * endpoint. Otherwise, the end iterator.
560  *
561  * @par Example
562  * The following connect condition function object can be used to output
563  * information about the individual connection attempts:
564  * @code struct my_connect_condition
565  * {
566  *   bool operator()(
567  *       const boost::system::error_code& ec,
568  *       const::tcp::endpoint& next)
569  *   {
570  *     if (ec) std::cout << "Error: " << ec.message() << std::endl;
571  *     std::cout << "Trying: " << next << std::endl;
572  *     return true;
573  *   }
574  * }; @endcode
575  * It would be used with the boost::asio::connect function as follows:
576  * @code tcp::resolver r(my_context);
577  * tcp::resolver::query q("host", "service");
578  * tcp::resolver::results_type e = r.resolve(q);
579  * tcp::socket s(my_context);
580  * boost::system::error_code ec;
581  * tcp::resolver::results_type::iterator i = boost::asio::connect(
582  *     s, e.begin(), e.end(), my_connect_condition());
583  * if (ec)
584  * {
585  *   // An error occurred.
586  * }
587  * else
588  * {
589  *   std::cout << "Connected to: " << i->endpoint() << std::endl;
590  * } @endcode
591  */
592 template <typename Protocol, typename Executor,
593     typename Iterator, typename ConnectCondition>
594 Iterator connect(basic_socket<Protocol, Executor>& s,
595     Iterator begin, Iterator end, ConnectCondition connect_condition,
596     boost::system::error_code& ec);
597
598 /*@}*/
599
600 /**
601  * @defgroup async_connect boost::asio::async_connect
602  *
603  * @brief The @c async_connect function is a composed asynchronous operation
604  * that establishes a socket connection by trying each endpoint in a sequence.
605  */
606 /*@{*/
607
608 /// Asynchronously establishes a socket connection by trying each endpoint in a
609 /// sequence.
610 /**
611  * This function attempts to connect a socket to one of a sequence of
612  * endpoints. It does this by repeated calls to the socket's @c async_connect
613  * member function, once for each endpoint in the sequence, until a connection
614  * is successfully established.
615  *
616  * @param s The socket to be connected. If the socket is already open, it will
617  * be closed.
618  *
619  * @param endpoints A sequence of endpoints.
620  *
621  * @param handler The handler to be called when the connect operation
622  * completes. Copies will be made of the handler as required. The function
623  * signature of the handler must be:
624  * @code void handler(
625  *   // Result of operation. if the sequence is empty, set to
626  *   // boost::asio::error::not_found. Otherwise, contains the
627  *   // error from the last connection attempt.
628  *   const boost::system::error_code& error,
629  *
630  *   // On success, the successfully connected endpoint.
631  *   // Otherwise, a default-constructed endpoint.
632  *   const typename Protocol::endpoint& endpoint
633  * ); @endcode
634  * Regardless of whether the asynchronous operation completes immediately or
635  * not, the handler will not be invoked from within this function. On
636  * immediate completion, invocation of the handler will be performed in a
637  * manner equivalent to using boost::asio::post().
638  *
639  * @par Example
640  * @code tcp::resolver r(my_context);
641  * tcp::resolver::query q("host", "service");
642  * tcp::socket s(my_context);
643  *
644  * // ...
645  *
646  * r.async_resolve(q, resolve_handler);
647  *
648  * // ...
649  *
650  * void resolve_handler(
651  *     const boost::system::error_code& ec,
652  *     tcp::resolver::results_type results)
653  * {
654  *   if (!ec)
655  *   {
656  *     boost::asio::async_connect(s, results, connect_handler);
657  *   }
658  * }
659  *
660  * // ...
661  *
662  * void connect_handler(
663  *     const boost::system::error_code& ec,
664  *     const tcp::endpoint& endpoint)
665  * {
666  *   // ...
667  * } @endcode
668  */
669 template <typename Protocol, typename Executor, typename EndpointSequence,
670     BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
671       typename Protocol::endpoint)) RangeConnectHandler
672         BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(Executor)>
673 BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(RangeConnectHandler,
674     void (boost::system::error_code, typename Protocol::endpoint))
675 async_connect(basic_socket<Protocol, Executor>& s,
676     const EndpointSequence& endpoints,
677     BOOST_ASIO_MOVE_ARG(RangeConnectHandler) handler
678       BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(Executor),
679     typename enable_if<is_endpoint_sequence<
680         EndpointSequence>::value>::type* = 0);
681
682 #if !defined(BOOST_ASIO_NO_DEPRECATED)
683 /// (Deprecated: Use range overload.) Asynchronously establishes a socket
684 /// connection by trying each endpoint in a sequence.
685 /**
686  * This function attempts to connect a socket to one of a sequence of
687  * endpoints. It does this by repeated calls to the socket's @c async_connect
688  * member function, once for each endpoint in the sequence, until a connection
689  * is successfully established.
690  *
691  * @param s The socket to be connected. If the socket is already open, it will
692  * be closed.
693  *
694  * @param begin An iterator pointing to the start of a sequence of endpoints.
695  *
696  * @param handler The handler to be called when the connect operation
697  * completes. Copies will be made of the handler as required. The function
698  * signature of the handler must be:
699  * @code void handler(
700  *   // Result of operation. if the sequence is empty, set to
701  *   // boost::asio::error::not_found. Otherwise, contains the
702  *   // error from the last connection attempt.
703  *   const boost::system::error_code& error,
704  *
705  *   // On success, an iterator denoting the successfully
706  *   // connected endpoint. Otherwise, the end iterator.
707  *   Iterator iterator
708  * ); @endcode
709  * Regardless of whether the asynchronous operation completes immediately or
710  * not, the handler will not be invoked from within this function. On
711  * immediate completion, invocation of the handler will be performed in a
712  * manner equivalent to using boost::asio::post().
713  *
714  * @note This overload assumes that a default constructed object of type @c
715  * Iterator represents the end of the sequence. This is a valid assumption for
716  * iterator types such as @c boost::asio::ip::tcp::resolver::iterator.
717  */
718 template <typename Protocol, typename Executor, typename Iterator,
719     BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
720       Iterator)) IteratorConnectHandler
721         BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(Executor)>
722 BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(IteratorConnectHandler,
723     void (boost::system::error_code, Iterator))
724 async_connect(basic_socket<Protocol, Executor>& s, Iterator begin,
725     BOOST_ASIO_MOVE_ARG(IteratorConnectHandler) handler
726       BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(Executor),
727     typename enable_if<!is_endpoint_sequence<Iterator>::value>::type* = 0);
728 #endif // !defined(BOOST_ASIO_NO_DEPRECATED)
729
730 /// Asynchronously establishes a socket connection by trying each endpoint in a
731 /// sequence.
732 /**
733  * This function attempts to connect a socket to one of a sequence of
734  * endpoints. It does this by repeated calls to the socket's @c async_connect
735  * member function, once for each endpoint in the sequence, until a connection
736  * is successfully established.
737  *
738  * @param s The socket to be connected. If the socket is already open, it will
739  * be closed.
740  *
741  * @param begin An iterator pointing to the start of a sequence of endpoints.
742  *
743  * @param end An iterator pointing to the end of a sequence of endpoints.
744  *
745  * @param handler The handler to be called when the connect operation
746  * completes. Copies will be made of the handler as required. The function
747  * signature of the handler must be:
748  * @code void handler(
749  *   // Result of operation. if the sequence is empty, set to
750  *   // boost::asio::error::not_found. Otherwise, contains the
751  *   // error from the last connection attempt.
752  *   const boost::system::error_code& error,
753  *
754  *   // On success, an iterator denoting the successfully
755  *   // connected endpoint. Otherwise, the end iterator.
756  *   Iterator iterator
757  * ); @endcode
758  * Regardless of whether the asynchronous operation completes immediately or
759  * not, the handler will not be invoked from within this function. On
760  * immediate completion, invocation of the handler will be performed in a
761  * manner equivalent to using boost::asio::post().
762  *
763  * @par Example
764  * @code std::vector<tcp::endpoint> endpoints = ...;
765  * tcp::socket s(my_context);
766  * boost::asio::async_connect(s,
767  *     endpoints.begin(), endpoints.end(),
768  *     connect_handler);
769  *
770  * // ...
771  *
772  * void connect_handler(
773  *     const boost::system::error_code& ec,
774  *     std::vector<tcp::endpoint>::iterator i)
775  * {
776  *   // ...
777  * } @endcode
778  */
779 template <typename Protocol, typename Executor, typename Iterator,
780     BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
781       Iterator)) IteratorConnectHandler
782         BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(Executor)>
783 BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(IteratorConnectHandler,
784     void (boost::system::error_code, Iterator))
785 async_connect(basic_socket<Protocol, Executor>& s, Iterator begin, Iterator end,
786     BOOST_ASIO_MOVE_ARG(IteratorConnectHandler) handler
787       BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(Executor));
788
789 /// Asynchronously establishes a socket connection by trying each endpoint in a
790 /// sequence.
791 /**
792  * This function attempts to connect a socket to one of a sequence of
793  * endpoints. It does this by repeated calls to the socket's @c async_connect
794  * member function, once for each endpoint in the sequence, until a connection
795  * is successfully established.
796  *
797  * @param s The socket to be connected. If the socket is already open, it will
798  * be closed.
799  *
800  * @param endpoints A sequence of endpoints.
801  *
802  * @param connect_condition A function object that is called prior to each
803  * connection attempt. The signature of the function object must be:
804  * @code bool connect_condition(
805  *     const boost::system::error_code& ec,
806  *     const typename Protocol::endpoint& next); @endcode
807  * The @c ec parameter contains the result from the most recent connect
808  * operation. Before the first connection attempt, @c ec is always set to
809  * indicate success. The @c next parameter is the next endpoint to be tried.
810  * The function object should return true if the next endpoint should be tried,
811  * and false if it should be skipped.
812  *
813  * @param handler The handler to be called when the connect operation
814  * completes. Copies will be made of the handler as required. The function
815  * signature of the handler must be:
816  * @code void handler(
817  *   // Result of operation. if the sequence is empty, set to
818  *   // boost::asio::error::not_found. Otherwise, contains the
819  *   // error from the last connection attempt.
820  *   const boost::system::error_code& error,
821  *
822  *   // On success, an iterator denoting the successfully
823  *   // connected endpoint. Otherwise, the end iterator.
824  *   Iterator iterator
825  * ); @endcode
826  * Regardless of whether the asynchronous operation completes immediately or
827  * not, the handler will not be invoked from within this function. On
828  * immediate completion, invocation of the handler will be performed in a
829  * manner equivalent to using boost::asio::post().
830  *
831  * @par Example
832  * The following connect condition function object can be used to output
833  * information about the individual connection attempts:
834  * @code struct my_connect_condition
835  * {
836  *   bool operator()(
837  *       const boost::system::error_code& ec,
838  *       const::tcp::endpoint& next)
839  *   {
840  *     if (ec) std::cout << "Error: " << ec.message() << std::endl;
841  *     std::cout << "Trying: " << next << std::endl;
842  *     return true;
843  *   }
844  * }; @endcode
845  * It would be used with the boost::asio::connect function as follows:
846  * @code tcp::resolver r(my_context);
847  * tcp::resolver::query q("host", "service");
848  * tcp::socket s(my_context);
849  *
850  * // ...
851  *
852  * r.async_resolve(q, resolve_handler);
853  *
854  * // ...
855  *
856  * void resolve_handler(
857  *     const boost::system::error_code& ec,
858  *     tcp::resolver::results_type results)
859  * {
860  *   if (!ec)
861  *   {
862  *     boost::asio::async_connect(s, results,
863  *         my_connect_condition(),
864  *         connect_handler);
865  *   }
866  * }
867  *
868  * // ...
869  *
870  * void connect_handler(
871  *     const boost::system::error_code& ec,
872  *     const tcp::endpoint& endpoint)
873  * {
874  *   if (ec)
875  *   {
876  *     // An error occurred.
877  *   }
878  *   else
879  *   {
880  *     std::cout << "Connected to: " << endpoint << std::endl;
881  *   }
882  * } @endcode
883  */
884 template <typename Protocol, typename Executor,
885     typename EndpointSequence, typename ConnectCondition,
886     BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
887       typename Protocol::endpoint)) RangeConnectHandler
888         BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(Executor)>
889 BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(RangeConnectHandler,
890     void (boost::system::error_code, typename Protocol::endpoint))
891 async_connect(basic_socket<Protocol, Executor>& s,
892     const EndpointSequence& endpoints, ConnectCondition connect_condition,
893     BOOST_ASIO_MOVE_ARG(RangeConnectHandler) handler
894       BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(Executor),
895     typename enable_if<is_endpoint_sequence<
896         EndpointSequence>::value>::type* = 0);
897
898 #if !defined(BOOST_ASIO_NO_DEPRECATED)
899 /// (Deprecated: Use range overload.) Asynchronously establishes a socket
900 /// connection by trying each endpoint in a sequence.
901 /**
902  * This function attempts to connect a socket to one of a sequence of
903  * endpoints. It does this by repeated calls to the socket's @c async_connect
904  * member function, once for each endpoint in the sequence, until a connection
905  * is successfully established.
906  *
907  * @param s The socket to be connected. If the socket is already open, it will
908  * be closed.
909  *
910  * @param begin An iterator pointing to the start of a sequence of endpoints.
911  *
912  * @param connect_condition A function object that is called prior to each
913  * connection attempt. The signature of the function object must be:
914  * @code bool connect_condition(
915  *     const boost::system::error_code& ec,
916  *     const typename Protocol::endpoint& next); @endcode
917  * The @c ec parameter contains the result from the most recent connect
918  * operation. Before the first connection attempt, @c ec is always set to
919  * indicate success. The @c next parameter is the next endpoint to be tried.
920  * The function object should return true if the next endpoint should be tried,
921  * and false if it should be skipped.
922  *
923  * @param handler The handler to be called when the connect operation
924  * completes. Copies will be made of the handler as required. The function
925  * signature of the handler must be:
926  * @code void handler(
927  *   // Result of operation. if the sequence is empty, set to
928  *   // boost::asio::error::not_found. Otherwise, contains the
929  *   // error from the last connection attempt.
930  *   const boost::system::error_code& error,
931  *
932  *   // On success, an iterator denoting the successfully
933  *   // connected endpoint. Otherwise, the end iterator.
934  *   Iterator iterator
935  * ); @endcode
936  * Regardless of whether the asynchronous operation completes immediately or
937  * not, the handler will not be invoked from within this function. On
938  * immediate completion, invocation of the handler will be performed in a
939  * manner equivalent to using boost::asio::post().
940  *
941  * @note This overload assumes that a default constructed object of type @c
942  * Iterator represents the end of the sequence. This is a valid assumption for
943  * iterator types such as @c boost::asio::ip::tcp::resolver::iterator.
944  */
945 template <typename Protocol, typename Executor,
946     typename Iterator, typename ConnectCondition,
947     BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
948       Iterator)) IteratorConnectHandler
949         BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(Executor)>
950 BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(IteratorConnectHandler,
951     void (boost::system::error_code, Iterator))
952 async_connect(basic_socket<Protocol, Executor>& s, Iterator begin,
953     ConnectCondition connect_condition,
954     BOOST_ASIO_MOVE_ARG(IteratorConnectHandler) handler
955       BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(Executor),
956     typename enable_if<!is_endpoint_sequence<Iterator>::value>::type* = 0);
957 #endif // !defined(BOOST_ASIO_NO_DEPRECATED)
958
959 /// Asynchronously establishes a socket connection by trying each endpoint in a
960 /// sequence.
961 /**
962  * This function attempts to connect a socket to one of a sequence of
963  * endpoints. It does this by repeated calls to the socket's @c async_connect
964  * member function, once for each endpoint in the sequence, until a connection
965  * is successfully established.
966  *
967  * @param s The socket to be connected. If the socket is already open, it will
968  * be closed.
969  *
970  * @param begin An iterator pointing to the start of a sequence of endpoints.
971  *
972  * @param end An iterator pointing to the end of a sequence of endpoints.
973  *
974  * @param connect_condition A function object that is called prior to each
975  * connection attempt. The signature of the function object must be:
976  * @code bool connect_condition(
977  *     const boost::system::error_code& ec,
978  *     const typename Protocol::endpoint& next); @endcode
979  * The @c ec parameter contains the result from the most recent connect
980  * operation. Before the first connection attempt, @c ec is always set to
981  * indicate success. The @c next parameter is the next endpoint to be tried.
982  * The function object should return true if the next endpoint should be tried,
983  * and false if it should be skipped.
984  *
985  * @param handler The handler to be called when the connect operation
986  * completes. Copies will be made of the handler as required. The function
987  * signature of the handler must be:
988  * @code void handler(
989  *   // Result of operation. if the sequence is empty, set to
990  *   // boost::asio::error::not_found. Otherwise, contains the
991  *   // error from the last connection attempt.
992  *   const boost::system::error_code& error,
993  *
994  *   // On success, an iterator denoting the successfully
995  *   // connected endpoint. Otherwise, the end iterator.
996  *   Iterator iterator
997  * ); @endcode
998  * Regardless of whether the asynchronous operation completes immediately or
999  * not, the handler will not be invoked from within this function. On
1000  * immediate completion, invocation of the handler will be performed in a
1001  * manner equivalent to using boost::asio::post().
1002  *
1003  * @par Example
1004  * The following connect condition function object can be used to output
1005  * information about the individual connection attempts:
1006  * @code struct my_connect_condition
1007  * {
1008  *   bool operator()(
1009  *       const boost::system::error_code& ec,
1010  *       const::tcp::endpoint& next)
1011  *   {
1012  *     if (ec) std::cout << "Error: " << ec.message() << std::endl;
1013  *     std::cout << "Trying: " << next << std::endl;
1014  *     return true;
1015  *   }
1016  * }; @endcode
1017  * It would be used with the boost::asio::connect function as follows:
1018  * @code tcp::resolver r(my_context);
1019  * tcp::resolver::query q("host", "service");
1020  * tcp::socket s(my_context);
1021  *
1022  * // ...
1023  *
1024  * r.async_resolve(q, resolve_handler);
1025  *
1026  * // ...
1027  *
1028  * void resolve_handler(
1029  *     const boost::system::error_code& ec,
1030  *     tcp::resolver::iterator i)
1031  * {
1032  *   if (!ec)
1033  *   {
1034  *     tcp::resolver::iterator end;
1035  *     boost::asio::async_connect(s, i, end,
1036  *         my_connect_condition(),
1037  *         connect_handler);
1038  *   }
1039  * }
1040  *
1041  * // ...
1042  *
1043  * void connect_handler(
1044  *     const boost::system::error_code& ec,
1045  *     tcp::resolver::iterator i)
1046  * {
1047  *   if (ec)
1048  *   {
1049  *     // An error occurred.
1050  *   }
1051  *   else
1052  *   {
1053  *     std::cout << "Connected to: " << i->endpoint() << std::endl;
1054  *   }
1055  * } @endcode
1056  */
1057 template <typename Protocol, typename Executor,
1058     typename Iterator, typename ConnectCondition,
1059     BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code,
1060       Iterator)) IteratorConnectHandler
1061         BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(Executor)>
1062 BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(IteratorConnectHandler,
1063     void (boost::system::error_code, Iterator))
1064 async_connect(basic_socket<Protocol, Executor>& s, Iterator begin,
1065     Iterator end, ConnectCondition connect_condition,
1066     BOOST_ASIO_MOVE_ARG(IteratorConnectHandler) handler
1067       BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(Executor));
1068
1069 /*@}*/
1070
1071 } // namespace asio
1072 } // namespace boost
1073
1074 #include <boost/asio/detail/pop_options.hpp>
1075
1076 #include <boost/asio/impl/connect.hpp>
1077
1078 #endif