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