Асинхронно устанавливает соединение сокетов, пробуя каждую конечную точку в последовательности.
template<
typename Protocol,
typename SocketService,
typename Iterator,
typename ConnectCondition,
typename ComposedConnectHandler>
void-or-deduced async_connect(
basic_socket< Protocol, SocketService > & s,
Iterator begin,
Iterator end,
ConnectCondition connect_condition,
ComposedConnectHandler handler);
Эта функция пытается подключить сокет к одной из последовательности конечных точек. Он делает это путем повторных вызовов функции члена сокета async_connect
, один раз для каждой конечной точки в последовательности, пока соединение не будет успешно установлено.
- s
Сокет должен быть подключен. Если розетка уже открыта, она будет закрыта.
- begin
Итератор, указывающий на начало последовательности конечных точек.
- end
Итератор, указывающий на конец последовательности конечных точек.
- connect_condition
-
Объект функции, который называется перед каждой попыткой соединения. Подпись объекта функции должна быть:
Iterator connect_condition(
const boost::system::error_code& ec,
Iterator next);
Параметр ec
содержит результат самой последней операции соединения. Перед первой попыткой соединения ec
всегда указывает на успех. Параметр next
представляет собой итератор, указывающий на следующую конечную точку, которую нужно опробовать. Объект функции должен вернуть следующий итератор, но ему разрешено вернуть другой итератор, чтобы конечные точки могли быть пропущены. Реализация гарантирует, что объект функции никогда не будет называться конечным итератором.
- handler
-
Обработчик должен быть вызван, когда операция подключения завершится. Копии будут сделаны из обработчика по мере необходимости. Функциональная подпись обработчика должна быть:
void handler(
const boost::system::error_code& error,
Iterator iterator
);
Независимо от того, выполняется ли асинхронная операция немедленно или нет, обработчик не будет вызываться из этой функции. Вызов обработчика будет выполнен способом, эквивалентным использованию boost::asio::io_service::post()
.
Для вывода информации об отдельных попытках соединения может использоваться следующий объект функции состояния соединения:
struct my_connect_condition
{
template <typename Iterator>
Iterator operator()(
const boost::system::error_code& ec,
Iterator next)
{
if (ec) std::cout << "Error: " << ec.message() << std::endl;
std::cout << "Trying: " << next->endpoint() << std::endl;
return next;
}
};
Он будет использоваться с функцией boost::asio::connect
следующим образом:
tcp::resolver r(io_service);
tcp::resolver::query q("host", "service");
tcp::socket s(io_service);
r.async_resolve(q, resolve_handler);
void resolve_handler(
const boost::system::error_code& ec,
tcp::resolver::iterator i)
{
if (!ec)
{
tcp::resolver::iterator end;
boost::asio::async_connect(s, i, end,
my_connect_condition(),
connect_handler);
}
}
void connect_handler(
const boost::system::error_code& ec,
tcp::resolver::iterator i)
{
if (ec)
{
}
else
{
std::cout << "Connected to: " << i->endpoint() << std::endl;
}
}