xref: /aosp_15_r20/external/parameter-framework/asio-1.10.6/include/asio/connect.hpp (revision c33452fb792a5495ec310a9626f2638b053af5dd)
1*c33452fbSAndroid Build Coastguard Worker //
2*c33452fbSAndroid Build Coastguard Worker // connect.hpp
3*c33452fbSAndroid Build Coastguard Worker // ~~~~~~~~~~~
4*c33452fbSAndroid Build Coastguard Worker //
5*c33452fbSAndroid Build Coastguard Worker // Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com)
6*c33452fbSAndroid Build Coastguard Worker //
7*c33452fbSAndroid Build Coastguard Worker // Distributed under the Boost Software License, Version 1.0. (See accompanying
8*c33452fbSAndroid Build Coastguard Worker // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
9*c33452fbSAndroid Build Coastguard Worker //
10*c33452fbSAndroid Build Coastguard Worker 
11*c33452fbSAndroid Build Coastguard Worker #ifndef ASIO_CONNECT_HPP
12*c33452fbSAndroid Build Coastguard Worker #define ASIO_CONNECT_HPP
13*c33452fbSAndroid Build Coastguard Worker 
14*c33452fbSAndroid Build Coastguard Worker 
15*c33452fbSAndroid Build Coastguard Worker #include "asio/detail/config.hpp"
16*c33452fbSAndroid Build Coastguard Worker #include "asio/async_result.hpp"
17*c33452fbSAndroid Build Coastguard Worker #include "asio/basic_socket.hpp"
18*c33452fbSAndroid Build Coastguard Worker #include "asio/error.hpp"
19*c33452fbSAndroid Build Coastguard Worker 
20*c33452fbSAndroid Build Coastguard Worker #include "asio/detail/push_options.hpp"
21*c33452fbSAndroid Build Coastguard Worker 
22*c33452fbSAndroid Build Coastguard Worker namespace asio {
23*c33452fbSAndroid Build Coastguard Worker 
24*c33452fbSAndroid Build Coastguard Worker /**
25*c33452fbSAndroid Build Coastguard Worker  * @defgroup connect asio::connect
26*c33452fbSAndroid Build Coastguard Worker  *
27*c33452fbSAndroid Build Coastguard Worker  * @brief Establishes a socket connection by trying each endpoint in a sequence.
28*c33452fbSAndroid Build Coastguard Worker  */
29*c33452fbSAndroid Build Coastguard Worker /*@{*/
30*c33452fbSAndroid Build Coastguard Worker 
31*c33452fbSAndroid Build Coastguard Worker /// Establishes a socket connection by trying each endpoint in a sequence.
32*c33452fbSAndroid Build Coastguard Worker /**
33*c33452fbSAndroid Build Coastguard Worker  * This function attempts to connect a socket to one of a sequence of
34*c33452fbSAndroid Build Coastguard Worker  * endpoints. It does this by repeated calls to the socket's @c connect member
35*c33452fbSAndroid Build Coastguard Worker  * function, once for each endpoint in the sequence, until a connection is
36*c33452fbSAndroid Build Coastguard Worker  * successfully established.
37*c33452fbSAndroid Build Coastguard Worker  *
38*c33452fbSAndroid Build Coastguard Worker  * @param s The socket to be connected. If the socket is already open, it will
39*c33452fbSAndroid Build Coastguard Worker  * be closed.
40*c33452fbSAndroid Build Coastguard Worker  *
41*c33452fbSAndroid Build Coastguard Worker  * @param begin An iterator pointing to the start of a sequence of endpoints.
42*c33452fbSAndroid Build Coastguard Worker  *
43*c33452fbSAndroid Build Coastguard Worker  * @returns On success, an iterator denoting the successfully connected
44*c33452fbSAndroid Build Coastguard Worker  * endpoint. Otherwise, the end iterator.
45*c33452fbSAndroid Build Coastguard Worker  *
46*c33452fbSAndroid Build Coastguard Worker  * @throws asio::system_error Thrown on failure. If the sequence is
47*c33452fbSAndroid Build Coastguard Worker  * empty, the associated @c error_code is asio::error::not_found.
48*c33452fbSAndroid Build Coastguard Worker  * Otherwise, contains the error from the last connection attempt.
49*c33452fbSAndroid Build Coastguard Worker  *
50*c33452fbSAndroid Build Coastguard Worker  * @note This overload assumes that a default constructed object of type @c
51*c33452fbSAndroid Build Coastguard Worker  * Iterator represents the end of the sequence. This is a valid assumption for
52*c33452fbSAndroid Build Coastguard Worker  * iterator types such as @c asio::ip::tcp::resolver::iterator.
53*c33452fbSAndroid Build Coastguard Worker  *
54*c33452fbSAndroid Build Coastguard Worker  * @par Example
55*c33452fbSAndroid Build Coastguard Worker  * @code tcp::resolver r(io_service);
56*c33452fbSAndroid Build Coastguard Worker  * tcp::resolver::query q("host", "service");
57*c33452fbSAndroid Build Coastguard Worker  * tcp::socket s(io_service);
58*c33452fbSAndroid Build Coastguard Worker  * asio::connect(s, r.resolve(q)); @endcode
59*c33452fbSAndroid Build Coastguard Worker  */
60*c33452fbSAndroid Build Coastguard Worker template <typename Protocol, typename SocketService, typename Iterator>
61*c33452fbSAndroid Build Coastguard Worker Iterator connect(basic_socket<Protocol, SocketService>& s, Iterator begin);
62*c33452fbSAndroid Build Coastguard Worker 
63*c33452fbSAndroid Build Coastguard Worker /// Establishes a socket connection by trying each endpoint in a sequence.
64*c33452fbSAndroid Build Coastguard Worker /**
65*c33452fbSAndroid Build Coastguard Worker  * This function attempts to connect a socket to one of a sequence of
66*c33452fbSAndroid Build Coastguard Worker  * endpoints. It does this by repeated calls to the socket's @c connect member
67*c33452fbSAndroid Build Coastguard Worker  * function, once for each endpoint in the sequence, until a connection is
68*c33452fbSAndroid Build Coastguard Worker  * successfully established.
69*c33452fbSAndroid Build Coastguard Worker  *
70*c33452fbSAndroid Build Coastguard Worker  * @param s The socket to be connected. If the socket is already open, it will
71*c33452fbSAndroid Build Coastguard Worker  * be closed.
72*c33452fbSAndroid Build Coastguard Worker  *
73*c33452fbSAndroid Build Coastguard Worker  * @param begin An iterator pointing to the start of a sequence of endpoints.
74*c33452fbSAndroid Build Coastguard Worker  *
75*c33452fbSAndroid Build Coastguard Worker  * @param ec Set to indicate what error occurred, if any. If the sequence is
76*c33452fbSAndroid Build Coastguard Worker  * empty, set to asio::error::not_found. Otherwise, contains the error
77*c33452fbSAndroid Build Coastguard Worker  * from the last connection attempt.
78*c33452fbSAndroid Build Coastguard Worker  *
79*c33452fbSAndroid Build Coastguard Worker  * @returns On success, an iterator denoting the successfully connected
80*c33452fbSAndroid Build Coastguard Worker  * endpoint. Otherwise, the end iterator.
81*c33452fbSAndroid Build Coastguard Worker  *
82*c33452fbSAndroid Build Coastguard Worker  * @note This overload assumes that a default constructed object of type @c
83*c33452fbSAndroid Build Coastguard Worker  * Iterator represents the end of the sequence. This is a valid assumption for
84*c33452fbSAndroid Build Coastguard Worker  * iterator types such as @c asio::ip::tcp::resolver::iterator.
85*c33452fbSAndroid Build Coastguard Worker  *
86*c33452fbSAndroid Build Coastguard Worker  * @par Example
87*c33452fbSAndroid Build Coastguard Worker  * @code tcp::resolver r(io_service);
88*c33452fbSAndroid Build Coastguard Worker  * tcp::resolver::query q("host", "service");
89*c33452fbSAndroid Build Coastguard Worker  * tcp::socket s(io_service);
90*c33452fbSAndroid Build Coastguard Worker  * asio::error_code ec;
91*c33452fbSAndroid Build Coastguard Worker  * asio::connect(s, r.resolve(q), ec);
92*c33452fbSAndroid Build Coastguard Worker  * if (ec)
93*c33452fbSAndroid Build Coastguard Worker  * {
94*c33452fbSAndroid Build Coastguard Worker  *   // An error occurred.
95*c33452fbSAndroid Build Coastguard Worker  * } @endcode
96*c33452fbSAndroid Build Coastguard Worker  */
97*c33452fbSAndroid Build Coastguard Worker template <typename Protocol, typename SocketService, typename Iterator>
98*c33452fbSAndroid Build Coastguard Worker Iterator connect(basic_socket<Protocol, SocketService>& s,
99*c33452fbSAndroid Build Coastguard Worker     Iterator begin, asio::error_code& ec);
100*c33452fbSAndroid Build Coastguard Worker 
101*c33452fbSAndroid Build Coastguard Worker /// Establishes a socket connection by trying each endpoint in a sequence.
102*c33452fbSAndroid Build Coastguard Worker /**
103*c33452fbSAndroid Build Coastguard Worker  * This function attempts to connect a socket to one of a sequence of
104*c33452fbSAndroid Build Coastguard Worker  * endpoints. It does this by repeated calls to the socket's @c connect member
105*c33452fbSAndroid Build Coastguard Worker  * function, once for each endpoint in the sequence, until a connection is
106*c33452fbSAndroid Build Coastguard Worker  * successfully established.
107*c33452fbSAndroid Build Coastguard Worker  *
108*c33452fbSAndroid Build Coastguard Worker  * @param s The socket to be connected. If the socket is already open, it will
109*c33452fbSAndroid Build Coastguard Worker  * be closed.
110*c33452fbSAndroid Build Coastguard Worker  *
111*c33452fbSAndroid Build Coastguard Worker  * @param begin An iterator pointing to the start of a sequence of endpoints.
112*c33452fbSAndroid Build Coastguard Worker  *
113*c33452fbSAndroid Build Coastguard Worker  * @param end An iterator pointing to the end of a sequence of endpoints.
114*c33452fbSAndroid Build Coastguard Worker  *
115*c33452fbSAndroid Build Coastguard Worker  * @returns On success, an iterator denoting the successfully connected
116*c33452fbSAndroid Build Coastguard Worker  * endpoint. Otherwise, the end iterator.
117*c33452fbSAndroid Build Coastguard Worker  *
118*c33452fbSAndroid Build Coastguard Worker  * @throws asio::system_error Thrown on failure. If the sequence is
119*c33452fbSAndroid Build Coastguard Worker  * empty, the associated @c error_code is asio::error::not_found.
120*c33452fbSAndroid Build Coastguard Worker  * Otherwise, contains the error from the last connection attempt.
121*c33452fbSAndroid Build Coastguard Worker  *
122*c33452fbSAndroid Build Coastguard Worker  * @par Example
123*c33452fbSAndroid Build Coastguard Worker  * @code tcp::resolver r(io_service);
124*c33452fbSAndroid Build Coastguard Worker  * tcp::resolver::query q("host", "service");
125*c33452fbSAndroid Build Coastguard Worker  * tcp::resolver::iterator i = r.resolve(q), end;
126*c33452fbSAndroid Build Coastguard Worker  * tcp::socket s(io_service);
127*c33452fbSAndroid Build Coastguard Worker  * asio::connect(s, i, end); @endcode
128*c33452fbSAndroid Build Coastguard Worker  */
129*c33452fbSAndroid Build Coastguard Worker template <typename Protocol, typename SocketService, typename Iterator>
130*c33452fbSAndroid Build Coastguard Worker Iterator connect(basic_socket<Protocol, SocketService>& s,
131*c33452fbSAndroid Build Coastguard Worker     Iterator begin, Iterator end);
132*c33452fbSAndroid Build Coastguard Worker 
133*c33452fbSAndroid Build Coastguard Worker /// Establishes a socket connection by trying each endpoint in a sequence.
134*c33452fbSAndroid Build Coastguard Worker /**
135*c33452fbSAndroid Build Coastguard Worker  * This function attempts to connect a socket to one of a sequence of
136*c33452fbSAndroid Build Coastguard Worker  * endpoints. It does this by repeated calls to the socket's @c connect member
137*c33452fbSAndroid Build Coastguard Worker  * function, once for each endpoint in the sequence, until a connection is
138*c33452fbSAndroid Build Coastguard Worker  * successfully established.
139*c33452fbSAndroid Build Coastguard Worker  *
140*c33452fbSAndroid Build Coastguard Worker  * @param s The socket to be connected. If the socket is already open, it will
141*c33452fbSAndroid Build Coastguard Worker  * be closed.
142*c33452fbSAndroid Build Coastguard Worker  *
143*c33452fbSAndroid Build Coastguard Worker  * @param begin An iterator pointing to the start of a sequence of endpoints.
144*c33452fbSAndroid Build Coastguard Worker  *
145*c33452fbSAndroid Build Coastguard Worker  * @param end An iterator pointing to the end of a sequence of endpoints.
146*c33452fbSAndroid Build Coastguard Worker  *
147*c33452fbSAndroid Build Coastguard Worker  * @param ec Set to indicate what error occurred, if any. If the sequence is
148*c33452fbSAndroid Build Coastguard Worker  * empty, set to asio::error::not_found. Otherwise, contains the error
149*c33452fbSAndroid Build Coastguard Worker  * from the last connection attempt.
150*c33452fbSAndroid Build Coastguard Worker  *
151*c33452fbSAndroid Build Coastguard Worker  * @returns On success, an iterator denoting the successfully connected
152*c33452fbSAndroid Build Coastguard Worker  * endpoint. Otherwise, the end iterator.
153*c33452fbSAndroid Build Coastguard Worker  *
154*c33452fbSAndroid Build Coastguard Worker  * @par Example
155*c33452fbSAndroid Build Coastguard Worker  * @code tcp::resolver r(io_service);
156*c33452fbSAndroid Build Coastguard Worker  * tcp::resolver::query q("host", "service");
157*c33452fbSAndroid Build Coastguard Worker  * tcp::resolver::iterator i = r.resolve(q), end;
158*c33452fbSAndroid Build Coastguard Worker  * tcp::socket s(io_service);
159*c33452fbSAndroid Build Coastguard Worker  * asio::error_code ec;
160*c33452fbSAndroid Build Coastguard Worker  * asio::connect(s, i, end, ec);
161*c33452fbSAndroid Build Coastguard Worker  * if (ec)
162*c33452fbSAndroid Build Coastguard Worker  * {
163*c33452fbSAndroid Build Coastguard Worker  *   // An error occurred.
164*c33452fbSAndroid Build Coastguard Worker  * } @endcode
165*c33452fbSAndroid Build Coastguard Worker  */
166*c33452fbSAndroid Build Coastguard Worker template <typename Protocol, typename SocketService, typename Iterator>
167*c33452fbSAndroid Build Coastguard Worker Iterator connect(basic_socket<Protocol, SocketService>& s,
168*c33452fbSAndroid Build Coastguard Worker     Iterator begin, Iterator end, asio::error_code& ec);
169*c33452fbSAndroid Build Coastguard Worker 
170*c33452fbSAndroid Build Coastguard Worker /// Establishes a socket connection by trying each endpoint in a sequence.
171*c33452fbSAndroid Build Coastguard Worker /**
172*c33452fbSAndroid Build Coastguard Worker  * This function attempts to connect a socket to one of a sequence of
173*c33452fbSAndroid Build Coastguard Worker  * endpoints. It does this by repeated calls to the socket's @c connect member
174*c33452fbSAndroid Build Coastguard Worker  * function, once for each endpoint in the sequence, until a connection is
175*c33452fbSAndroid Build Coastguard Worker  * successfully established.
176*c33452fbSAndroid Build Coastguard Worker  *
177*c33452fbSAndroid Build Coastguard Worker  * @param s The socket to be connected. If the socket is already open, it will
178*c33452fbSAndroid Build Coastguard Worker  * be closed.
179*c33452fbSAndroid Build Coastguard Worker  *
180*c33452fbSAndroid Build Coastguard Worker  * @param begin An iterator pointing to the start of a sequence of endpoints.
181*c33452fbSAndroid Build Coastguard Worker  *
182*c33452fbSAndroid Build Coastguard Worker  * @param connect_condition A function object that is called prior to each
183*c33452fbSAndroid Build Coastguard Worker  * connection attempt. The signature of the function object must be:
184*c33452fbSAndroid Build Coastguard Worker  * @code Iterator connect_condition(
185*c33452fbSAndroid Build Coastguard Worker  *     const asio::error_code& ec,
186*c33452fbSAndroid Build Coastguard Worker  *     Iterator next); @endcode
187*c33452fbSAndroid Build Coastguard Worker  * The @c ec parameter contains the result from the most recent connect
188*c33452fbSAndroid Build Coastguard Worker  * operation. Before the first connection attempt, @c ec is always set to
189*c33452fbSAndroid Build Coastguard Worker  * indicate success. The @c next parameter is an iterator pointing to the next
190*c33452fbSAndroid Build Coastguard Worker  * endpoint to be tried. The function object should return the next iterator,
191*c33452fbSAndroid Build Coastguard Worker  * but is permitted to return a different iterator so that endpoints may be
192*c33452fbSAndroid Build Coastguard Worker  * skipped. The implementation guarantees that the function object will never
193*c33452fbSAndroid Build Coastguard Worker  * be called with the end iterator.
194*c33452fbSAndroid Build Coastguard Worker  *
195*c33452fbSAndroid Build Coastguard Worker  * @returns On success, an iterator denoting the successfully connected
196*c33452fbSAndroid Build Coastguard Worker  * endpoint. Otherwise, the end iterator.
197*c33452fbSAndroid Build Coastguard Worker  *
198*c33452fbSAndroid Build Coastguard Worker  * @throws asio::system_error Thrown on failure. If the sequence is
199*c33452fbSAndroid Build Coastguard Worker  * empty, the associated @c error_code is asio::error::not_found.
200*c33452fbSAndroid Build Coastguard Worker  * Otherwise, contains the error from the last connection attempt.
201*c33452fbSAndroid Build Coastguard Worker  *
202*c33452fbSAndroid Build Coastguard Worker  * @note This overload assumes that a default constructed object of type @c
203*c33452fbSAndroid Build Coastguard Worker  * Iterator represents the end of the sequence. This is a valid assumption for
204*c33452fbSAndroid Build Coastguard Worker  * iterator types such as @c asio::ip::tcp::resolver::iterator.
205*c33452fbSAndroid Build Coastguard Worker  *
206*c33452fbSAndroid Build Coastguard Worker  * @par Example
207*c33452fbSAndroid Build Coastguard Worker  * The following connect condition function object can be used to output
208*c33452fbSAndroid Build Coastguard Worker  * information about the individual connection attempts:
209*c33452fbSAndroid Build Coastguard Worker  * @code struct my_connect_condition
210*c33452fbSAndroid Build Coastguard Worker  * {
211*c33452fbSAndroid Build Coastguard Worker  *   template <typename Iterator>
212*c33452fbSAndroid Build Coastguard Worker  *   Iterator operator()(
213*c33452fbSAndroid Build Coastguard Worker  *       const asio::error_code& ec,
214*c33452fbSAndroid Build Coastguard Worker  *       Iterator next)
215*c33452fbSAndroid Build Coastguard Worker  *   {
216*c33452fbSAndroid Build Coastguard Worker  *     if (ec) std::cout << "Error: " << ec.message() << std::endl;
217*c33452fbSAndroid Build Coastguard Worker  *     std::cout << "Trying: " << next->endpoint() << std::endl;
218*c33452fbSAndroid Build Coastguard Worker  *     return next;
219*c33452fbSAndroid Build Coastguard Worker  *   }
220*c33452fbSAndroid Build Coastguard Worker  * }; @endcode
221*c33452fbSAndroid Build Coastguard Worker  * It would be used with the asio::connect function as follows:
222*c33452fbSAndroid Build Coastguard Worker  * @code tcp::resolver r(io_service);
223*c33452fbSAndroid Build Coastguard Worker  * tcp::resolver::query q("host", "service");
224*c33452fbSAndroid Build Coastguard Worker  * tcp::socket s(io_service);
225*c33452fbSAndroid Build Coastguard Worker  * tcp::resolver::iterator i = asio::connect(
226*c33452fbSAndroid Build Coastguard Worker  *     s, r.resolve(q), my_connect_condition());
227*c33452fbSAndroid Build Coastguard Worker  * std::cout << "Connected to: " << i->endpoint() << std::endl; @endcode
228*c33452fbSAndroid Build Coastguard Worker  */
229*c33452fbSAndroid Build Coastguard Worker template <typename Protocol, typename SocketService,
230*c33452fbSAndroid Build Coastguard Worker     typename Iterator, typename ConnectCondition>
231*c33452fbSAndroid Build Coastguard Worker Iterator connect(basic_socket<Protocol, SocketService>& s,
232*c33452fbSAndroid Build Coastguard Worker     Iterator begin, ConnectCondition connect_condition);
233*c33452fbSAndroid Build Coastguard Worker 
234*c33452fbSAndroid Build Coastguard Worker /// Establishes a socket connection by trying each endpoint in a sequence.
235*c33452fbSAndroid Build Coastguard Worker /**
236*c33452fbSAndroid Build Coastguard Worker  * This function attempts to connect a socket to one of a sequence of
237*c33452fbSAndroid Build Coastguard Worker  * endpoints. It does this by repeated calls to the socket's @c connect member
238*c33452fbSAndroid Build Coastguard Worker  * function, once for each endpoint in the sequence, until a connection is
239*c33452fbSAndroid Build Coastguard Worker  * successfully established.
240*c33452fbSAndroid Build Coastguard Worker  *
241*c33452fbSAndroid Build Coastguard Worker  * @param s The socket to be connected. If the socket is already open, it will
242*c33452fbSAndroid Build Coastguard Worker  * be closed.
243*c33452fbSAndroid Build Coastguard Worker  *
244*c33452fbSAndroid Build Coastguard Worker  * @param begin An iterator pointing to the start of a sequence of endpoints.
245*c33452fbSAndroid Build Coastguard Worker  *
246*c33452fbSAndroid Build Coastguard Worker  * @param connect_condition A function object that is called prior to each
247*c33452fbSAndroid Build Coastguard Worker  * connection attempt. The signature of the function object must be:
248*c33452fbSAndroid Build Coastguard Worker  * @code Iterator connect_condition(
249*c33452fbSAndroid Build Coastguard Worker  *     const asio::error_code& ec,
250*c33452fbSAndroid Build Coastguard Worker  *     Iterator next); @endcode
251*c33452fbSAndroid Build Coastguard Worker  * The @c ec parameter contains the result from the most recent connect
252*c33452fbSAndroid Build Coastguard Worker  * operation. Before the first connection attempt, @c ec is always set to
253*c33452fbSAndroid Build Coastguard Worker  * indicate success. The @c next parameter is an iterator pointing to the next
254*c33452fbSAndroid Build Coastguard Worker  * endpoint to be tried. The function object should return the next iterator,
255*c33452fbSAndroid Build Coastguard Worker  * but is permitted to return a different iterator so that endpoints may be
256*c33452fbSAndroid Build Coastguard Worker  * skipped. The implementation guarantees that the function object will never
257*c33452fbSAndroid Build Coastguard Worker  * be called with the end iterator.
258*c33452fbSAndroid Build Coastguard Worker  *
259*c33452fbSAndroid Build Coastguard Worker  * @param ec Set to indicate what error occurred, if any. If the sequence is
260*c33452fbSAndroid Build Coastguard Worker  * empty, set to asio::error::not_found. Otherwise, contains the error
261*c33452fbSAndroid Build Coastguard Worker  * from the last connection attempt.
262*c33452fbSAndroid Build Coastguard Worker  *
263*c33452fbSAndroid Build Coastguard Worker  * @returns On success, an iterator denoting the successfully connected
264*c33452fbSAndroid Build Coastguard Worker  * endpoint. Otherwise, the end iterator.
265*c33452fbSAndroid Build Coastguard Worker  *
266*c33452fbSAndroid Build Coastguard Worker  * @note This overload assumes that a default constructed object of type @c
267*c33452fbSAndroid Build Coastguard Worker  * Iterator represents the end of the sequence. This is a valid assumption for
268*c33452fbSAndroid Build Coastguard Worker  * iterator types such as @c asio::ip::tcp::resolver::iterator.
269*c33452fbSAndroid Build Coastguard Worker  *
270*c33452fbSAndroid Build Coastguard Worker  * @par Example
271*c33452fbSAndroid Build Coastguard Worker  * The following connect condition function object can be used to output
272*c33452fbSAndroid Build Coastguard Worker  * information about the individual connection attempts:
273*c33452fbSAndroid Build Coastguard Worker  * @code struct my_connect_condition
274*c33452fbSAndroid Build Coastguard Worker  * {
275*c33452fbSAndroid Build Coastguard Worker  *   template <typename Iterator>
276*c33452fbSAndroid Build Coastguard Worker  *   Iterator operator()(
277*c33452fbSAndroid Build Coastguard Worker  *       const asio::error_code& ec,
278*c33452fbSAndroid Build Coastguard Worker  *       Iterator next)
279*c33452fbSAndroid Build Coastguard Worker  *   {
280*c33452fbSAndroid Build Coastguard Worker  *     if (ec) std::cout << "Error: " << ec.message() << std::endl;
281*c33452fbSAndroid Build Coastguard Worker  *     std::cout << "Trying: " << next->endpoint() << std::endl;
282*c33452fbSAndroid Build Coastguard Worker  *     return next;
283*c33452fbSAndroid Build Coastguard Worker  *   }
284*c33452fbSAndroid Build Coastguard Worker  * }; @endcode
285*c33452fbSAndroid Build Coastguard Worker  * It would be used with the asio::connect function as follows:
286*c33452fbSAndroid Build Coastguard Worker  * @code tcp::resolver r(io_service);
287*c33452fbSAndroid Build Coastguard Worker  * tcp::resolver::query q("host", "service");
288*c33452fbSAndroid Build Coastguard Worker  * tcp::socket s(io_service);
289*c33452fbSAndroid Build Coastguard Worker  * asio::error_code ec;
290*c33452fbSAndroid Build Coastguard Worker  * tcp::resolver::iterator i = asio::connect(
291*c33452fbSAndroid Build Coastguard Worker  *     s, r.resolve(q), my_connect_condition(), ec);
292*c33452fbSAndroid Build Coastguard Worker  * if (ec)
293*c33452fbSAndroid Build Coastguard Worker  * {
294*c33452fbSAndroid Build Coastguard Worker  *   // An error occurred.
295*c33452fbSAndroid Build Coastguard Worker  * }
296*c33452fbSAndroid Build Coastguard Worker  * else
297*c33452fbSAndroid Build Coastguard Worker  * {
298*c33452fbSAndroid Build Coastguard Worker  *   std::cout << "Connected to: " << i->endpoint() << std::endl;
299*c33452fbSAndroid Build Coastguard Worker  * } @endcode
300*c33452fbSAndroid Build Coastguard Worker  */
301*c33452fbSAndroid Build Coastguard Worker template <typename Protocol, typename SocketService,
302*c33452fbSAndroid Build Coastguard Worker     typename Iterator, typename ConnectCondition>
303*c33452fbSAndroid Build Coastguard Worker Iterator connect(basic_socket<Protocol, SocketService>& s, Iterator begin,
304*c33452fbSAndroid Build Coastguard Worker     ConnectCondition connect_condition, asio::error_code& ec);
305*c33452fbSAndroid Build Coastguard Worker 
306*c33452fbSAndroid Build Coastguard Worker /// Establishes a socket connection by trying each endpoint in a sequence.
307*c33452fbSAndroid Build Coastguard Worker /**
308*c33452fbSAndroid Build Coastguard Worker  * This function attempts to connect a socket to one of a sequence of
309*c33452fbSAndroid Build Coastguard Worker  * endpoints. It does this by repeated calls to the socket's @c connect member
310*c33452fbSAndroid Build Coastguard Worker  * function, once for each endpoint in the sequence, until a connection is
311*c33452fbSAndroid Build Coastguard Worker  * successfully established.
312*c33452fbSAndroid Build Coastguard Worker  *
313*c33452fbSAndroid Build Coastguard Worker  * @param s The socket to be connected. If the socket is already open, it will
314*c33452fbSAndroid Build Coastguard Worker  * be closed.
315*c33452fbSAndroid Build Coastguard Worker  *
316*c33452fbSAndroid Build Coastguard Worker  * @param begin An iterator pointing to the start of a sequence of endpoints.
317*c33452fbSAndroid Build Coastguard Worker  *
318*c33452fbSAndroid Build Coastguard Worker  * @param end An iterator pointing to the end of a sequence of endpoints.
319*c33452fbSAndroid Build Coastguard Worker  *
320*c33452fbSAndroid Build Coastguard Worker  * @param connect_condition A function object that is called prior to each
321*c33452fbSAndroid Build Coastguard Worker  * connection attempt. The signature of the function object must be:
322*c33452fbSAndroid Build Coastguard Worker  * @code Iterator connect_condition(
323*c33452fbSAndroid Build Coastguard Worker  *     const asio::error_code& ec,
324*c33452fbSAndroid Build Coastguard Worker  *     Iterator next); @endcode
325*c33452fbSAndroid Build Coastguard Worker  * The @c ec parameter contains the result from the most recent connect
326*c33452fbSAndroid Build Coastguard Worker  * operation. Before the first connection attempt, @c ec is always set to
327*c33452fbSAndroid Build Coastguard Worker  * indicate success. The @c next parameter is an iterator pointing to the next
328*c33452fbSAndroid Build Coastguard Worker  * endpoint to be tried. The function object should return the next iterator,
329*c33452fbSAndroid Build Coastguard Worker  * but is permitted to return a different iterator so that endpoints may be
330*c33452fbSAndroid Build Coastguard Worker  * skipped. The implementation guarantees that the function object will never
331*c33452fbSAndroid Build Coastguard Worker  * be called with the end iterator.
332*c33452fbSAndroid Build Coastguard Worker  *
333*c33452fbSAndroid Build Coastguard Worker  * @returns On success, an iterator denoting the successfully connected
334*c33452fbSAndroid Build Coastguard Worker  * endpoint. Otherwise, the end iterator.
335*c33452fbSAndroid Build Coastguard Worker  *
336*c33452fbSAndroid Build Coastguard Worker  * @throws asio::system_error Thrown on failure. If the sequence is
337*c33452fbSAndroid Build Coastguard Worker  * empty, the associated @c error_code is asio::error::not_found.
338*c33452fbSAndroid Build Coastguard Worker  * Otherwise, contains the error from the last connection attempt.
339*c33452fbSAndroid Build Coastguard Worker  *
340*c33452fbSAndroid Build Coastguard Worker  * @par Example
341*c33452fbSAndroid Build Coastguard Worker  * The following connect condition function object can be used to output
342*c33452fbSAndroid Build Coastguard Worker  * information about the individual connection attempts:
343*c33452fbSAndroid Build Coastguard Worker  * @code struct my_connect_condition
344*c33452fbSAndroid Build Coastguard Worker  * {
345*c33452fbSAndroid Build Coastguard Worker  *   template <typename Iterator>
346*c33452fbSAndroid Build Coastguard Worker  *   Iterator operator()(
347*c33452fbSAndroid Build Coastguard Worker  *       const asio::error_code& ec,
348*c33452fbSAndroid Build Coastguard Worker  *       Iterator next)
349*c33452fbSAndroid Build Coastguard Worker  *   {
350*c33452fbSAndroid Build Coastguard Worker  *     if (ec) std::cout << "Error: " << ec.message() << std::endl;
351*c33452fbSAndroid Build Coastguard Worker  *     std::cout << "Trying: " << next->endpoint() << std::endl;
352*c33452fbSAndroid Build Coastguard Worker  *     return next;
353*c33452fbSAndroid Build Coastguard Worker  *   }
354*c33452fbSAndroid Build Coastguard Worker  * }; @endcode
355*c33452fbSAndroid Build Coastguard Worker  * It would be used with the asio::connect function as follows:
356*c33452fbSAndroid Build Coastguard Worker  * @code tcp::resolver r(io_service);
357*c33452fbSAndroid Build Coastguard Worker  * tcp::resolver::query q("host", "service");
358*c33452fbSAndroid Build Coastguard Worker  * tcp::resolver::iterator i = r.resolve(q), end;
359*c33452fbSAndroid Build Coastguard Worker  * tcp::socket s(io_service);
360*c33452fbSAndroid Build Coastguard Worker  * i = asio::connect(s, i, end, my_connect_condition());
361*c33452fbSAndroid Build Coastguard Worker  * std::cout << "Connected to: " << i->endpoint() << std::endl; @endcode
362*c33452fbSAndroid Build Coastguard Worker  */
363*c33452fbSAndroid Build Coastguard Worker template <typename Protocol, typename SocketService,
364*c33452fbSAndroid Build Coastguard Worker     typename Iterator, typename ConnectCondition>
365*c33452fbSAndroid Build Coastguard Worker Iterator connect(basic_socket<Protocol, SocketService>& s, Iterator begin,
366*c33452fbSAndroid Build Coastguard Worker     Iterator end, ConnectCondition connect_condition);
367*c33452fbSAndroid Build Coastguard Worker 
368*c33452fbSAndroid Build Coastguard Worker /// Establishes a socket connection by trying each endpoint in a sequence.
369*c33452fbSAndroid Build Coastguard Worker /**
370*c33452fbSAndroid Build Coastguard Worker  * This function attempts to connect a socket to one of a sequence of
371*c33452fbSAndroid Build Coastguard Worker  * endpoints. It does this by repeated calls to the socket's @c connect member
372*c33452fbSAndroid Build Coastguard Worker  * function, once for each endpoint in the sequence, until a connection is
373*c33452fbSAndroid Build Coastguard Worker  * successfully established.
374*c33452fbSAndroid Build Coastguard Worker  *
375*c33452fbSAndroid Build Coastguard Worker  * @param s The socket to be connected. If the socket is already open, it will
376*c33452fbSAndroid Build Coastguard Worker  * be closed.
377*c33452fbSAndroid Build Coastguard Worker  *
378*c33452fbSAndroid Build Coastguard Worker  * @param begin An iterator pointing to the start of a sequence of endpoints.
379*c33452fbSAndroid Build Coastguard Worker  *
380*c33452fbSAndroid Build Coastguard Worker  * @param end An iterator pointing to the end of a sequence of endpoints.
381*c33452fbSAndroid Build Coastguard Worker  *
382*c33452fbSAndroid Build Coastguard Worker  * @param connect_condition A function object that is called prior to each
383*c33452fbSAndroid Build Coastguard Worker  * connection attempt. The signature of the function object must be:
384*c33452fbSAndroid Build Coastguard Worker  * @code Iterator connect_condition(
385*c33452fbSAndroid Build Coastguard Worker  *     const asio::error_code& ec,
386*c33452fbSAndroid Build Coastguard Worker  *     Iterator next); @endcode
387*c33452fbSAndroid Build Coastguard Worker  * The @c ec parameter contains the result from the most recent connect
388*c33452fbSAndroid Build Coastguard Worker  * operation. Before the first connection attempt, @c ec is always set to
389*c33452fbSAndroid Build Coastguard Worker  * indicate success. The @c next parameter is an iterator pointing to the next
390*c33452fbSAndroid Build Coastguard Worker  * endpoint to be tried. The function object should return the next iterator,
391*c33452fbSAndroid Build Coastguard Worker  * but is permitted to return a different iterator so that endpoints may be
392*c33452fbSAndroid Build Coastguard Worker  * skipped. The implementation guarantees that the function object will never
393*c33452fbSAndroid Build Coastguard Worker  * be called with the end iterator.
394*c33452fbSAndroid Build Coastguard Worker  *
395*c33452fbSAndroid Build Coastguard Worker  * @param ec Set to indicate what error occurred, if any. If the sequence is
396*c33452fbSAndroid Build Coastguard Worker  * empty, set to asio::error::not_found. Otherwise, contains the error
397*c33452fbSAndroid Build Coastguard Worker  * from the last connection attempt.
398*c33452fbSAndroid Build Coastguard Worker  *
399*c33452fbSAndroid Build Coastguard Worker  * @returns On success, an iterator denoting the successfully connected
400*c33452fbSAndroid Build Coastguard Worker  * endpoint. Otherwise, the end iterator.
401*c33452fbSAndroid Build Coastguard Worker  *
402*c33452fbSAndroid Build Coastguard Worker  * @par Example
403*c33452fbSAndroid Build Coastguard Worker  * The following connect condition function object can be used to output
404*c33452fbSAndroid Build Coastguard Worker  * information about the individual connection attempts:
405*c33452fbSAndroid Build Coastguard Worker  * @code struct my_connect_condition
406*c33452fbSAndroid Build Coastguard Worker  * {
407*c33452fbSAndroid Build Coastguard Worker  *   template <typename Iterator>
408*c33452fbSAndroid Build Coastguard Worker  *   Iterator operator()(
409*c33452fbSAndroid Build Coastguard Worker  *       const asio::error_code& ec,
410*c33452fbSAndroid Build Coastguard Worker  *       Iterator next)
411*c33452fbSAndroid Build Coastguard Worker  *   {
412*c33452fbSAndroid Build Coastguard Worker  *     if (ec) std::cout << "Error: " << ec.message() << std::endl;
413*c33452fbSAndroid Build Coastguard Worker  *     std::cout << "Trying: " << next->endpoint() << std::endl;
414*c33452fbSAndroid Build Coastguard Worker  *     return next;
415*c33452fbSAndroid Build Coastguard Worker  *   }
416*c33452fbSAndroid Build Coastguard Worker  * }; @endcode
417*c33452fbSAndroid Build Coastguard Worker  * It would be used with the asio::connect function as follows:
418*c33452fbSAndroid Build Coastguard Worker  * @code tcp::resolver r(io_service);
419*c33452fbSAndroid Build Coastguard Worker  * tcp::resolver::query q("host", "service");
420*c33452fbSAndroid Build Coastguard Worker  * tcp::resolver::iterator i = r.resolve(q), end;
421*c33452fbSAndroid Build Coastguard Worker  * tcp::socket s(io_service);
422*c33452fbSAndroid Build Coastguard Worker  * asio::error_code ec;
423*c33452fbSAndroid Build Coastguard Worker  * i = asio::connect(s, i, end, my_connect_condition(), ec);
424*c33452fbSAndroid Build Coastguard Worker  * if (ec)
425*c33452fbSAndroid Build Coastguard Worker  * {
426*c33452fbSAndroid Build Coastguard Worker  *   // An error occurred.
427*c33452fbSAndroid Build Coastguard Worker  * }
428*c33452fbSAndroid Build Coastguard Worker  * else
429*c33452fbSAndroid Build Coastguard Worker  * {
430*c33452fbSAndroid Build Coastguard Worker  *   std::cout << "Connected to: " << i->endpoint() << std::endl;
431*c33452fbSAndroid Build Coastguard Worker  * } @endcode
432*c33452fbSAndroid Build Coastguard Worker  */
433*c33452fbSAndroid Build Coastguard Worker template <typename Protocol, typename SocketService,
434*c33452fbSAndroid Build Coastguard Worker     typename Iterator, typename ConnectCondition>
435*c33452fbSAndroid Build Coastguard Worker Iterator connect(basic_socket<Protocol, SocketService>& s,
436*c33452fbSAndroid Build Coastguard Worker     Iterator begin, Iterator end, ConnectCondition connect_condition,
437*c33452fbSAndroid Build Coastguard Worker     asio::error_code& ec);
438*c33452fbSAndroid Build Coastguard Worker 
439*c33452fbSAndroid Build Coastguard Worker /*@}*/
440*c33452fbSAndroid Build Coastguard Worker 
441*c33452fbSAndroid Build Coastguard Worker /**
442*c33452fbSAndroid Build Coastguard Worker  * @defgroup async_connect asio::async_connect
443*c33452fbSAndroid Build Coastguard Worker  *
444*c33452fbSAndroid Build Coastguard Worker  * @brief Asynchronously establishes a socket connection by trying each
445*c33452fbSAndroid Build Coastguard Worker  * endpoint in a sequence.
446*c33452fbSAndroid Build Coastguard Worker  */
447*c33452fbSAndroid Build Coastguard Worker /*@{*/
448*c33452fbSAndroid Build Coastguard Worker 
449*c33452fbSAndroid Build Coastguard Worker /// Asynchronously establishes a socket connection by trying each endpoint in a
450*c33452fbSAndroid Build Coastguard Worker /// sequence.
451*c33452fbSAndroid Build Coastguard Worker /**
452*c33452fbSAndroid Build Coastguard Worker  * This function attempts to connect a socket to one of a sequence of
453*c33452fbSAndroid Build Coastguard Worker  * endpoints. It does this by repeated calls to the socket's @c async_connect
454*c33452fbSAndroid Build Coastguard Worker  * member function, once for each endpoint in the sequence, until a connection
455*c33452fbSAndroid Build Coastguard Worker  * is successfully established.
456*c33452fbSAndroid Build Coastguard Worker  *
457*c33452fbSAndroid Build Coastguard Worker  * @param s The socket to be connected. If the socket is already open, it will
458*c33452fbSAndroid Build Coastguard Worker  * be closed.
459*c33452fbSAndroid Build Coastguard Worker  *
460*c33452fbSAndroid Build Coastguard Worker  * @param begin An iterator pointing to the start of a sequence of endpoints.
461*c33452fbSAndroid Build Coastguard Worker  *
462*c33452fbSAndroid Build Coastguard Worker  * @param handler The handler to be called when the connect operation
463*c33452fbSAndroid Build Coastguard Worker  * completes. Copies will be made of the handler as required. The function
464*c33452fbSAndroid Build Coastguard Worker  * signature of the handler must be:
465*c33452fbSAndroid Build Coastguard Worker  * @code void handler(
466*c33452fbSAndroid Build Coastguard Worker  *   // Result of operation. if the sequence is empty, set to
467*c33452fbSAndroid Build Coastguard Worker  *   // asio::error::not_found. Otherwise, contains the
468*c33452fbSAndroid Build Coastguard Worker  *   // error from the last connection attempt.
469*c33452fbSAndroid Build Coastguard Worker  *   const asio::error_code& error,
470*c33452fbSAndroid Build Coastguard Worker  *
471*c33452fbSAndroid Build Coastguard Worker  *   // On success, an iterator denoting the successfully
472*c33452fbSAndroid Build Coastguard Worker  *   // connected endpoint. Otherwise, the end iterator.
473*c33452fbSAndroid Build Coastguard Worker  *   Iterator iterator
474*c33452fbSAndroid Build Coastguard Worker  * ); @endcode
475*c33452fbSAndroid Build Coastguard Worker  * Regardless of whether the asynchronous operation completes immediately or
476*c33452fbSAndroid Build Coastguard Worker  * not, the handler will not be invoked from within this function. Invocation
477*c33452fbSAndroid Build Coastguard Worker  * of the handler will be performed in a manner equivalent to using
478*c33452fbSAndroid Build Coastguard Worker  * asio::io_service::post().
479*c33452fbSAndroid Build Coastguard Worker  *
480*c33452fbSAndroid Build Coastguard Worker  * @note This overload assumes that a default constructed object of type @c
481*c33452fbSAndroid Build Coastguard Worker  * Iterator represents the end of the sequence. This is a valid assumption for
482*c33452fbSAndroid Build Coastguard Worker  * iterator types such as @c asio::ip::tcp::resolver::iterator.
483*c33452fbSAndroid Build Coastguard Worker  *
484*c33452fbSAndroid Build Coastguard Worker  * @par Example
485*c33452fbSAndroid Build Coastguard Worker  * @code tcp::resolver r(io_service);
486*c33452fbSAndroid Build Coastguard Worker  * tcp::resolver::query q("host", "service");
487*c33452fbSAndroid Build Coastguard Worker  * tcp::socket s(io_service);
488*c33452fbSAndroid Build Coastguard Worker  *
489*c33452fbSAndroid Build Coastguard Worker  * // ...
490*c33452fbSAndroid Build Coastguard Worker  *
491*c33452fbSAndroid Build Coastguard Worker  * r.async_resolve(q, resolve_handler);
492*c33452fbSAndroid Build Coastguard Worker  *
493*c33452fbSAndroid Build Coastguard Worker  * // ...
494*c33452fbSAndroid Build Coastguard Worker  *
495*c33452fbSAndroid Build Coastguard Worker  * void resolve_handler(
496*c33452fbSAndroid Build Coastguard Worker  *     const asio::error_code& ec,
497*c33452fbSAndroid Build Coastguard Worker  *     tcp::resolver::iterator i)
498*c33452fbSAndroid Build Coastguard Worker  * {
499*c33452fbSAndroid Build Coastguard Worker  *   if (!ec)
500*c33452fbSAndroid Build Coastguard Worker  *   {
501*c33452fbSAndroid Build Coastguard Worker  *     asio::async_connect(s, i, connect_handler);
502*c33452fbSAndroid Build Coastguard Worker  *   }
503*c33452fbSAndroid Build Coastguard Worker  * }
504*c33452fbSAndroid Build Coastguard Worker  *
505*c33452fbSAndroid Build Coastguard Worker  * // ...
506*c33452fbSAndroid Build Coastguard Worker  *
507*c33452fbSAndroid Build Coastguard Worker  * void connect_handler(
508*c33452fbSAndroid Build Coastguard Worker  *     const asio::error_code& ec,
509*c33452fbSAndroid Build Coastguard Worker  *     tcp::resolver::iterator i)
510*c33452fbSAndroid Build Coastguard Worker  * {
511*c33452fbSAndroid Build Coastguard Worker  *   // ...
512*c33452fbSAndroid Build Coastguard Worker  * } @endcode
513*c33452fbSAndroid Build Coastguard Worker  */
514*c33452fbSAndroid Build Coastguard Worker template <typename Protocol, typename SocketService,
515*c33452fbSAndroid Build Coastguard Worker     typename Iterator, typename ComposedConnectHandler>
516*c33452fbSAndroid Build Coastguard Worker ASIO_INITFN_RESULT_TYPE(ComposedConnectHandler,
517*c33452fbSAndroid Build Coastguard Worker     void (asio::error_code, Iterator))
518*c33452fbSAndroid Build Coastguard Worker async_connect(basic_socket<Protocol, SocketService>& s,
519*c33452fbSAndroid Build Coastguard Worker     Iterator begin, ASIO_MOVE_ARG(ComposedConnectHandler) handler);
520*c33452fbSAndroid Build Coastguard Worker 
521*c33452fbSAndroid Build Coastguard Worker /// Asynchronously establishes a socket connection by trying each endpoint in a
522*c33452fbSAndroid Build Coastguard Worker /// sequence.
523*c33452fbSAndroid Build Coastguard Worker /**
524*c33452fbSAndroid Build Coastguard Worker  * This function attempts to connect a socket to one of a sequence of
525*c33452fbSAndroid Build Coastguard Worker  * endpoints. It does this by repeated calls to the socket's @c async_connect
526*c33452fbSAndroid Build Coastguard Worker  * member function, once for each endpoint in the sequence, until a connection
527*c33452fbSAndroid Build Coastguard Worker  * is successfully established.
528*c33452fbSAndroid Build Coastguard Worker  *
529*c33452fbSAndroid Build Coastguard Worker  * @param s The socket to be connected. If the socket is already open, it will
530*c33452fbSAndroid Build Coastguard Worker  * be closed.
531*c33452fbSAndroid Build Coastguard Worker  *
532*c33452fbSAndroid Build Coastguard Worker  * @param begin An iterator pointing to the start of a sequence of endpoints.
533*c33452fbSAndroid Build Coastguard Worker  *
534*c33452fbSAndroid Build Coastguard Worker  * @param end An iterator pointing to the end of a sequence of endpoints.
535*c33452fbSAndroid Build Coastguard Worker  *
536*c33452fbSAndroid Build Coastguard Worker  * @param handler The handler to be called when the connect operation
537*c33452fbSAndroid Build Coastguard Worker  * completes. Copies will be made of the handler as required. The function
538*c33452fbSAndroid Build Coastguard Worker  * signature of the handler must be:
539*c33452fbSAndroid Build Coastguard Worker  * @code void handler(
540*c33452fbSAndroid Build Coastguard Worker  *   // Result of operation. if the sequence is empty, set to
541*c33452fbSAndroid Build Coastguard Worker  *   // asio::error::not_found. Otherwise, contains the
542*c33452fbSAndroid Build Coastguard Worker  *   // error from the last connection attempt.
543*c33452fbSAndroid Build Coastguard Worker  *   const asio::error_code& error,
544*c33452fbSAndroid Build Coastguard Worker  *
545*c33452fbSAndroid Build Coastguard Worker  *   // On success, an iterator denoting the successfully
546*c33452fbSAndroid Build Coastguard Worker  *   // connected endpoint. Otherwise, the end iterator.
547*c33452fbSAndroid Build Coastguard Worker  *   Iterator iterator
548*c33452fbSAndroid Build Coastguard Worker  * ); @endcode
549*c33452fbSAndroid Build Coastguard Worker  * Regardless of whether the asynchronous operation completes immediately or
550*c33452fbSAndroid Build Coastguard Worker  * not, the handler will not be invoked from within this function. Invocation
551*c33452fbSAndroid Build Coastguard Worker  * of the handler will be performed in a manner equivalent to using
552*c33452fbSAndroid Build Coastguard Worker  * asio::io_service::post().
553*c33452fbSAndroid Build Coastguard Worker  *
554*c33452fbSAndroid Build Coastguard Worker  * @par Example
555*c33452fbSAndroid Build Coastguard Worker  * @code tcp::resolver r(io_service);
556*c33452fbSAndroid Build Coastguard Worker  * tcp::resolver::query q("host", "service");
557*c33452fbSAndroid Build Coastguard Worker  * tcp::socket s(io_service);
558*c33452fbSAndroid Build Coastguard Worker  *
559*c33452fbSAndroid Build Coastguard Worker  * // ...
560*c33452fbSAndroid Build Coastguard Worker  *
561*c33452fbSAndroid Build Coastguard Worker  * r.async_resolve(q, resolve_handler);
562*c33452fbSAndroid Build Coastguard Worker  *
563*c33452fbSAndroid Build Coastguard Worker  * // ...
564*c33452fbSAndroid Build Coastguard Worker  *
565*c33452fbSAndroid Build Coastguard Worker  * void resolve_handler(
566*c33452fbSAndroid Build Coastguard Worker  *     const asio::error_code& ec,
567*c33452fbSAndroid Build Coastguard Worker  *     tcp::resolver::iterator i)
568*c33452fbSAndroid Build Coastguard Worker  * {
569*c33452fbSAndroid Build Coastguard Worker  *   if (!ec)
570*c33452fbSAndroid Build Coastguard Worker  *   {
571*c33452fbSAndroid Build Coastguard Worker  *     tcp::resolver::iterator end;
572*c33452fbSAndroid Build Coastguard Worker  *     asio::async_connect(s, i, end, connect_handler);
573*c33452fbSAndroid Build Coastguard Worker  *   }
574*c33452fbSAndroid Build Coastguard Worker  * }
575*c33452fbSAndroid Build Coastguard Worker  *
576*c33452fbSAndroid Build Coastguard Worker  * // ...
577*c33452fbSAndroid Build Coastguard Worker  *
578*c33452fbSAndroid Build Coastguard Worker  * void connect_handler(
579*c33452fbSAndroid Build Coastguard Worker  *     const asio::error_code& ec,
580*c33452fbSAndroid Build Coastguard Worker  *     tcp::resolver::iterator i)
581*c33452fbSAndroid Build Coastguard Worker  * {
582*c33452fbSAndroid Build Coastguard Worker  *   // ...
583*c33452fbSAndroid Build Coastguard Worker  * } @endcode
584*c33452fbSAndroid Build Coastguard Worker  */
585*c33452fbSAndroid Build Coastguard Worker template <typename Protocol, typename SocketService,
586*c33452fbSAndroid Build Coastguard Worker     typename Iterator, typename ComposedConnectHandler>
587*c33452fbSAndroid Build Coastguard Worker ASIO_INITFN_RESULT_TYPE(ComposedConnectHandler,
588*c33452fbSAndroid Build Coastguard Worker     void (asio::error_code, Iterator))
589*c33452fbSAndroid Build Coastguard Worker async_connect(basic_socket<Protocol, SocketService>& s,
590*c33452fbSAndroid Build Coastguard Worker     Iterator begin, Iterator end,
591*c33452fbSAndroid Build Coastguard Worker     ASIO_MOVE_ARG(ComposedConnectHandler) handler);
592*c33452fbSAndroid Build Coastguard Worker 
593*c33452fbSAndroid Build Coastguard Worker /// Asynchronously establishes a socket connection by trying each endpoint in a
594*c33452fbSAndroid Build Coastguard Worker /// sequence.
595*c33452fbSAndroid Build Coastguard Worker /**
596*c33452fbSAndroid Build Coastguard Worker  * This function attempts to connect a socket to one of a sequence of
597*c33452fbSAndroid Build Coastguard Worker  * endpoints. It does this by repeated calls to the socket's @c async_connect
598*c33452fbSAndroid Build Coastguard Worker  * member function, once for each endpoint in the sequence, until a connection
599*c33452fbSAndroid Build Coastguard Worker  * is successfully established.
600*c33452fbSAndroid Build Coastguard Worker  *
601*c33452fbSAndroid Build Coastguard Worker  * @param s The socket to be connected. If the socket is already open, it will
602*c33452fbSAndroid Build Coastguard Worker  * be closed.
603*c33452fbSAndroid Build Coastguard Worker  *
604*c33452fbSAndroid Build Coastguard Worker  * @param begin An iterator pointing to the start of a sequence of endpoints.
605*c33452fbSAndroid Build Coastguard Worker  *
606*c33452fbSAndroid Build Coastguard Worker  * @param connect_condition A function object that is called prior to each
607*c33452fbSAndroid Build Coastguard Worker  * connection attempt. The signature of the function object must be:
608*c33452fbSAndroid Build Coastguard Worker  * @code Iterator connect_condition(
609*c33452fbSAndroid Build Coastguard Worker  *     const asio::error_code& ec,
610*c33452fbSAndroid Build Coastguard Worker  *     Iterator next); @endcode
611*c33452fbSAndroid Build Coastguard Worker  * The @c ec parameter contains the result from the most recent connect
612*c33452fbSAndroid Build Coastguard Worker  * operation. Before the first connection attempt, @c ec is always set to
613*c33452fbSAndroid Build Coastguard Worker  * indicate success. The @c next parameter is an iterator pointing to the next
614*c33452fbSAndroid Build Coastguard Worker  * endpoint to be tried. The function object should return the next iterator,
615*c33452fbSAndroid Build Coastguard Worker  * but is permitted to return a different iterator so that endpoints may be
616*c33452fbSAndroid Build Coastguard Worker  * skipped. The implementation guarantees that the function object will never
617*c33452fbSAndroid Build Coastguard Worker  * be called with the end iterator.
618*c33452fbSAndroid Build Coastguard Worker  *
619*c33452fbSAndroid Build Coastguard Worker  * @param handler The handler to be called when the connect operation
620*c33452fbSAndroid Build Coastguard Worker  * completes. Copies will be made of the handler as required. The function
621*c33452fbSAndroid Build Coastguard Worker  * signature of the handler must be:
622*c33452fbSAndroid Build Coastguard Worker  * @code void handler(
623*c33452fbSAndroid Build Coastguard Worker  *   // Result of operation. if the sequence is empty, set to
624*c33452fbSAndroid Build Coastguard Worker  *   // asio::error::not_found. Otherwise, contains the
625*c33452fbSAndroid Build Coastguard Worker  *   // error from the last connection attempt.
626*c33452fbSAndroid Build Coastguard Worker  *   const asio::error_code& error,
627*c33452fbSAndroid Build Coastguard Worker  *
628*c33452fbSAndroid Build Coastguard Worker  *   // On success, an iterator denoting the successfully
629*c33452fbSAndroid Build Coastguard Worker  *   // connected endpoint. Otherwise, the end iterator.
630*c33452fbSAndroid Build Coastguard Worker  *   Iterator iterator
631*c33452fbSAndroid Build Coastguard Worker  * ); @endcode
632*c33452fbSAndroid Build Coastguard Worker  * Regardless of whether the asynchronous operation completes immediately or
633*c33452fbSAndroid Build Coastguard Worker  * not, the handler will not be invoked from within this function. Invocation
634*c33452fbSAndroid Build Coastguard Worker  * of the handler will be performed in a manner equivalent to using
635*c33452fbSAndroid Build Coastguard Worker  * asio::io_service::post().
636*c33452fbSAndroid Build Coastguard Worker  *
637*c33452fbSAndroid Build Coastguard Worker  * @note This overload assumes that a default constructed object of type @c
638*c33452fbSAndroid Build Coastguard Worker  * Iterator represents the end of the sequence. This is a valid assumption for
639*c33452fbSAndroid Build Coastguard Worker  * iterator types such as @c asio::ip::tcp::resolver::iterator.
640*c33452fbSAndroid Build Coastguard Worker  *
641*c33452fbSAndroid Build Coastguard Worker  * @par Example
642*c33452fbSAndroid Build Coastguard Worker  * The following connect condition function object can be used to output
643*c33452fbSAndroid Build Coastguard Worker  * information about the individual connection attempts:
644*c33452fbSAndroid Build Coastguard Worker  * @code struct my_connect_condition
645*c33452fbSAndroid Build Coastguard Worker  * {
646*c33452fbSAndroid Build Coastguard Worker  *   template <typename Iterator>
647*c33452fbSAndroid Build Coastguard Worker  *   Iterator operator()(
648*c33452fbSAndroid Build Coastguard Worker  *       const asio::error_code& ec,
649*c33452fbSAndroid Build Coastguard Worker  *       Iterator next)
650*c33452fbSAndroid Build Coastguard Worker  *   {
651*c33452fbSAndroid Build Coastguard Worker  *     if (ec) std::cout << "Error: " << ec.message() << std::endl;
652*c33452fbSAndroid Build Coastguard Worker  *     std::cout << "Trying: " << next->endpoint() << std::endl;
653*c33452fbSAndroid Build Coastguard Worker  *     return next;
654*c33452fbSAndroid Build Coastguard Worker  *   }
655*c33452fbSAndroid Build Coastguard Worker  * }; @endcode
656*c33452fbSAndroid Build Coastguard Worker  * It would be used with the asio::connect function as follows:
657*c33452fbSAndroid Build Coastguard Worker  * @code tcp::resolver r(io_service);
658*c33452fbSAndroid Build Coastguard Worker  * tcp::resolver::query q("host", "service");
659*c33452fbSAndroid Build Coastguard Worker  * tcp::socket s(io_service);
660*c33452fbSAndroid Build Coastguard Worker  *
661*c33452fbSAndroid Build Coastguard Worker  * // ...
662*c33452fbSAndroid Build Coastguard Worker  *
663*c33452fbSAndroid Build Coastguard Worker  * r.async_resolve(q, resolve_handler);
664*c33452fbSAndroid Build Coastguard Worker  *
665*c33452fbSAndroid Build Coastguard Worker  * // ...
666*c33452fbSAndroid Build Coastguard Worker  *
667*c33452fbSAndroid Build Coastguard Worker  * void resolve_handler(
668*c33452fbSAndroid Build Coastguard Worker  *     const asio::error_code& ec,
669*c33452fbSAndroid Build Coastguard Worker  *     tcp::resolver::iterator i)
670*c33452fbSAndroid Build Coastguard Worker  * {
671*c33452fbSAndroid Build Coastguard Worker  *   if (!ec)
672*c33452fbSAndroid Build Coastguard Worker  *   {
673*c33452fbSAndroid Build Coastguard Worker  *     asio::async_connect(s, i,
674*c33452fbSAndroid Build Coastguard Worker  *         my_connect_condition(),
675*c33452fbSAndroid Build Coastguard Worker  *         connect_handler);
676*c33452fbSAndroid Build Coastguard Worker  *   }
677*c33452fbSAndroid Build Coastguard Worker  * }
678*c33452fbSAndroid Build Coastguard Worker  *
679*c33452fbSAndroid Build Coastguard Worker  * // ...
680*c33452fbSAndroid Build Coastguard Worker  *
681*c33452fbSAndroid Build Coastguard Worker  * void connect_handler(
682*c33452fbSAndroid Build Coastguard Worker  *     const asio::error_code& ec,
683*c33452fbSAndroid Build Coastguard Worker  *     tcp::resolver::iterator i)
684*c33452fbSAndroid Build Coastguard Worker  * {
685*c33452fbSAndroid Build Coastguard Worker  *   if (ec)
686*c33452fbSAndroid Build Coastguard Worker  *   {
687*c33452fbSAndroid Build Coastguard Worker  *     // An error occurred.
688*c33452fbSAndroid Build Coastguard Worker  *   }
689*c33452fbSAndroid Build Coastguard Worker  *   else
690*c33452fbSAndroid Build Coastguard Worker  *   {
691*c33452fbSAndroid Build Coastguard Worker  *     std::cout << "Connected to: " << i->endpoint() << std::endl;
692*c33452fbSAndroid Build Coastguard Worker  *   }
693*c33452fbSAndroid Build Coastguard Worker  * } @endcode
694*c33452fbSAndroid Build Coastguard Worker  */
695*c33452fbSAndroid Build Coastguard Worker template <typename Protocol, typename SocketService, typename Iterator,
696*c33452fbSAndroid Build Coastguard Worker     typename ConnectCondition, typename ComposedConnectHandler>
697*c33452fbSAndroid Build Coastguard Worker ASIO_INITFN_RESULT_TYPE(ComposedConnectHandler,
698*c33452fbSAndroid Build Coastguard Worker     void (asio::error_code, Iterator))
699*c33452fbSAndroid Build Coastguard Worker async_connect(basic_socket<Protocol, SocketService>& s, Iterator begin,
700*c33452fbSAndroid Build Coastguard Worker     ConnectCondition connect_condition,
701*c33452fbSAndroid Build Coastguard Worker     ASIO_MOVE_ARG(ComposedConnectHandler) handler);
702*c33452fbSAndroid Build Coastguard Worker 
703*c33452fbSAndroid Build Coastguard Worker /// Asynchronously establishes a socket connection by trying each endpoint in a
704*c33452fbSAndroid Build Coastguard Worker /// sequence.
705*c33452fbSAndroid Build Coastguard Worker /**
706*c33452fbSAndroid Build Coastguard Worker  * This function attempts to connect a socket to one of a sequence of
707*c33452fbSAndroid Build Coastguard Worker  * endpoints. It does this by repeated calls to the socket's @c async_connect
708*c33452fbSAndroid Build Coastguard Worker  * member function, once for each endpoint in the sequence, until a connection
709*c33452fbSAndroid Build Coastguard Worker  * is successfully established.
710*c33452fbSAndroid Build Coastguard Worker  *
711*c33452fbSAndroid Build Coastguard Worker  * @param s The socket to be connected. If the socket is already open, it will
712*c33452fbSAndroid Build Coastguard Worker  * be closed.
713*c33452fbSAndroid Build Coastguard Worker  *
714*c33452fbSAndroid Build Coastguard Worker  * @param begin An iterator pointing to the start of a sequence of endpoints.
715*c33452fbSAndroid Build Coastguard Worker  *
716*c33452fbSAndroid Build Coastguard Worker  * @param end An iterator pointing to the end of a sequence of endpoints.
717*c33452fbSAndroid Build Coastguard Worker  *
718*c33452fbSAndroid Build Coastguard Worker  * @param connect_condition A function object that is called prior to each
719*c33452fbSAndroid Build Coastguard Worker  * connection attempt. The signature of the function object must be:
720*c33452fbSAndroid Build Coastguard Worker  * @code Iterator connect_condition(
721*c33452fbSAndroid Build Coastguard Worker  *     const asio::error_code& ec,
722*c33452fbSAndroid Build Coastguard Worker  *     Iterator next); @endcode
723*c33452fbSAndroid Build Coastguard Worker  * The @c ec parameter contains the result from the most recent connect
724*c33452fbSAndroid Build Coastguard Worker  * operation. Before the first connection attempt, @c ec is always set to
725*c33452fbSAndroid Build Coastguard Worker  * indicate success. The @c next parameter is an iterator pointing to the next
726*c33452fbSAndroid Build Coastguard Worker  * endpoint to be tried. The function object should return the next iterator,
727*c33452fbSAndroid Build Coastguard Worker  * but is permitted to return a different iterator so that endpoints may be
728*c33452fbSAndroid Build Coastguard Worker  * skipped. The implementation guarantees that the function object will never
729*c33452fbSAndroid Build Coastguard Worker  * be called with the end iterator.
730*c33452fbSAndroid Build Coastguard Worker  *
731*c33452fbSAndroid Build Coastguard Worker  * @param handler The handler to be called when the connect operation
732*c33452fbSAndroid Build Coastguard Worker  * completes. Copies will be made of the handler as required. The function
733*c33452fbSAndroid Build Coastguard Worker  * signature of the handler must be:
734*c33452fbSAndroid Build Coastguard Worker  * @code void handler(
735*c33452fbSAndroid Build Coastguard Worker  *   // Result of operation. if the sequence is empty, set to
736*c33452fbSAndroid Build Coastguard Worker  *   // asio::error::not_found. Otherwise, contains the
737*c33452fbSAndroid Build Coastguard Worker  *   // error from the last connection attempt.
738*c33452fbSAndroid Build Coastguard Worker  *   const asio::error_code& error,
739*c33452fbSAndroid Build Coastguard Worker  *
740*c33452fbSAndroid Build Coastguard Worker  *   // On success, an iterator denoting the successfully
741*c33452fbSAndroid Build Coastguard Worker  *   // connected endpoint. Otherwise, the end iterator.
742*c33452fbSAndroid Build Coastguard Worker  *   Iterator iterator
743*c33452fbSAndroid Build Coastguard Worker  * ); @endcode
744*c33452fbSAndroid Build Coastguard Worker  * Regardless of whether the asynchronous operation completes immediately or
745*c33452fbSAndroid Build Coastguard Worker  * not, the handler will not be invoked from within this function. Invocation
746*c33452fbSAndroid Build Coastguard Worker  * of the handler will be performed in a manner equivalent to using
747*c33452fbSAndroid Build Coastguard Worker  * asio::io_service::post().
748*c33452fbSAndroid Build Coastguard Worker  *
749*c33452fbSAndroid Build Coastguard Worker  * @par Example
750*c33452fbSAndroid Build Coastguard Worker  * The following connect condition function object can be used to output
751*c33452fbSAndroid Build Coastguard Worker  * information about the individual connection attempts:
752*c33452fbSAndroid Build Coastguard Worker  * @code struct my_connect_condition
753*c33452fbSAndroid Build Coastguard Worker  * {
754*c33452fbSAndroid Build Coastguard Worker  *   template <typename Iterator>
755*c33452fbSAndroid Build Coastguard Worker  *   Iterator operator()(
756*c33452fbSAndroid Build Coastguard Worker  *       const asio::error_code& ec,
757*c33452fbSAndroid Build Coastguard Worker  *       Iterator next)
758*c33452fbSAndroid Build Coastguard Worker  *   {
759*c33452fbSAndroid Build Coastguard Worker  *     if (ec) std::cout << "Error: " << ec.message() << std::endl;
760*c33452fbSAndroid Build Coastguard Worker  *     std::cout << "Trying: " << next->endpoint() << std::endl;
761*c33452fbSAndroid Build Coastguard Worker  *     return next;
762*c33452fbSAndroid Build Coastguard Worker  *   }
763*c33452fbSAndroid Build Coastguard Worker  * }; @endcode
764*c33452fbSAndroid Build Coastguard Worker  * It would be used with the asio::connect function as follows:
765*c33452fbSAndroid Build Coastguard Worker  * @code tcp::resolver r(io_service);
766*c33452fbSAndroid Build Coastguard Worker  * tcp::resolver::query q("host", "service");
767*c33452fbSAndroid Build Coastguard Worker  * tcp::socket s(io_service);
768*c33452fbSAndroid Build Coastguard Worker  *
769*c33452fbSAndroid Build Coastguard Worker  * // ...
770*c33452fbSAndroid Build Coastguard Worker  *
771*c33452fbSAndroid Build Coastguard Worker  * r.async_resolve(q, resolve_handler);
772*c33452fbSAndroid Build Coastguard Worker  *
773*c33452fbSAndroid Build Coastguard Worker  * // ...
774*c33452fbSAndroid Build Coastguard Worker  *
775*c33452fbSAndroid Build Coastguard Worker  * void resolve_handler(
776*c33452fbSAndroid Build Coastguard Worker  *     const asio::error_code& ec,
777*c33452fbSAndroid Build Coastguard Worker  *     tcp::resolver::iterator i)
778*c33452fbSAndroid Build Coastguard Worker  * {
779*c33452fbSAndroid Build Coastguard Worker  *   if (!ec)
780*c33452fbSAndroid Build Coastguard Worker  *   {
781*c33452fbSAndroid Build Coastguard Worker  *     tcp::resolver::iterator end;
782*c33452fbSAndroid Build Coastguard Worker  *     asio::async_connect(s, i, end,
783*c33452fbSAndroid Build Coastguard Worker  *         my_connect_condition(),
784*c33452fbSAndroid Build Coastguard Worker  *         connect_handler);
785*c33452fbSAndroid Build Coastguard Worker  *   }
786*c33452fbSAndroid Build Coastguard Worker  * }
787*c33452fbSAndroid Build Coastguard Worker  *
788*c33452fbSAndroid Build Coastguard Worker  * // ...
789*c33452fbSAndroid Build Coastguard Worker  *
790*c33452fbSAndroid Build Coastguard Worker  * void connect_handler(
791*c33452fbSAndroid Build Coastguard Worker  *     const asio::error_code& ec,
792*c33452fbSAndroid Build Coastguard Worker  *     tcp::resolver::iterator i)
793*c33452fbSAndroid Build Coastguard Worker  * {
794*c33452fbSAndroid Build Coastguard Worker  *   if (ec)
795*c33452fbSAndroid Build Coastguard Worker  *   {
796*c33452fbSAndroid Build Coastguard Worker  *     // An error occurred.
797*c33452fbSAndroid Build Coastguard Worker  *   }
798*c33452fbSAndroid Build Coastguard Worker  *   else
799*c33452fbSAndroid Build Coastguard Worker  *   {
800*c33452fbSAndroid Build Coastguard Worker  *     std::cout << "Connected to: " << i->endpoint() << std::endl;
801*c33452fbSAndroid Build Coastguard Worker  *   }
802*c33452fbSAndroid Build Coastguard Worker  * } @endcode
803*c33452fbSAndroid Build Coastguard Worker  */
804*c33452fbSAndroid Build Coastguard Worker template <typename Protocol, typename SocketService, typename Iterator,
805*c33452fbSAndroid Build Coastguard Worker     typename ConnectCondition, typename ComposedConnectHandler>
806*c33452fbSAndroid Build Coastguard Worker ASIO_INITFN_RESULT_TYPE(ComposedConnectHandler,
807*c33452fbSAndroid Build Coastguard Worker     void (asio::error_code, Iterator))
808*c33452fbSAndroid Build Coastguard Worker async_connect(basic_socket<Protocol, SocketService>& s,
809*c33452fbSAndroid Build Coastguard Worker     Iterator begin, Iterator end, ConnectCondition connect_condition,
810*c33452fbSAndroid Build Coastguard Worker     ASIO_MOVE_ARG(ComposedConnectHandler) handler);
811*c33452fbSAndroid Build Coastguard Worker 
812*c33452fbSAndroid Build Coastguard Worker /*@}*/
813*c33452fbSAndroid Build Coastguard Worker 
814*c33452fbSAndroid Build Coastguard Worker } // namespace asio
815*c33452fbSAndroid Build Coastguard Worker 
816*c33452fbSAndroid Build Coastguard Worker #include "asio/detail/pop_options.hpp"
817*c33452fbSAndroid Build Coastguard Worker 
818*c33452fbSAndroid Build Coastguard Worker #include "asio/impl/connect.hpp"
819*c33452fbSAndroid Build Coastguard Worker 
820*c33452fbSAndroid Build Coastguard Worker #endif
821