Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C/C++ Сетевое программирование
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.08.2019, 21:12   #1
Android1
Форумчанин
 
Регистрация: 26.08.2010
Сообщений: 121
По умолчанию Boost asio асинхронный

Здравствуйте,

Пытаюсь хоть сколько нибудь понять пример асинхронного клиента с сайта boost:
https://www.boost.org/doc/libs/1_40_...ync_client.cpp

Приведу только часть которую я не понял, на самом деле я вообще ниче не понял, так как застрял уже на функции ассинхронного резолва

Код:
void handle_resolve(const boost::system::error_code& err,
      tcp::resolver::iterator endpoint_iterator)
  {
    if (!err)
    {
      // Attempt a connection to the first endpoint in the list. Each endpoint
      // will be tried until we successfully establish a connection.
      tcp::endpoint endpoint = *endpoint_iterator;
      socket_.async_connect(endpoint,
          boost::bind(&client::handle_connect, this,
            boost::asio::placeholders::error, ++endpoint_iterator));
    }
    else
    {
      std::cout << "Error: " << err.message() << "\n";
    }
  }


boost::asio::io_service io_services; // создаем обьект io_services
tcp::resolver resolvers(io_services); // создаем обьект для резолва
tcp::socket socks(io_services);  // создаем сокет
boost::system::error_code ec; // создаем обьект ошибки
 
tcp::resolver::query querys("www.cyberforum", 80); // создаем запрос
tcp::resolver::iterator iteratorka = resolvers.async_resolve(querys,
        boost::bind(&client::handle_resolve, this,
          boost::asio::placeholders::error,
          boost::asio::placeholders::iterator));
  }
Я вообще не понимаю, как работает функция async_resolve, в синхронном resolve просто:
Код:
resolve(query, ec) // и все
Что за bind, зачем нужен этот handle_resolve, почему внутри этого handle_resolve есть socket.connect, если мне нужно просто прорезолвить по имени сайта ??
Почему нельзя просто дать async_resolve сам запрос query и обьект ошибки ??
Android1 вне форума Ответить с цитированием
Старый 04.08.2019, 08:12   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
Сообщение от Android1 Посмотреть сообщение
в синхронном resolve просто:
В асинхронном тоже за скидкой на асинхронность. Вам бы что-нибужь прочитать про асинхронности, колбеки и т.д.

Цитата:
Сообщение от Android1 Посмотреть сообщение
Что за bind
В справке он есть, в STL свои тоже есть. Для связывание первого параметра метода с this как минимум.

Цитата:
Сообщение от Android1 Посмотреть сообщение
зачем нужен этот handle_resolve
Это колбек. На них часто строится асинхронность.

Цитата:
Сообщение от Android1 Посмотреть сообщение
почему внутри этого handle_resolve есть socket.connect
Потому что вы выдрали кусок кода из примера, в котором резолвится имя и подключаются к нему. Там же даже комментарий есть.

Цитата:
Сообщение от Android1 Посмотреть сообщение
если мне нужно просто прорезолвить по имени сайта
Так резолвите...

Цитата:
Сообщение от Android1 Посмотреть сообщение
Почему нельзя просто дать async_resolve сам запрос query и обьект ошибки ??
Потому что это асинхронная функция и ей нужен колбек, чтобы вас известить. Хотя по сути ей так и передается запрос и место для ошибки.
p51x на форуме Ответить с цитированием
Старый 04.08.2019, 10:24   #3
Android1
Форумчанин
 
Регистрация: 26.08.2010
Сообщений: 121
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Так резолвите...

Потому что это асинхронная функция и ей нужен колбек, чтобы вас известить. Хотя по сути ей так и передается запрос и место для ошибки.
Так я и пытаюсь, но VS2017 выдает ошибку:
Код:
boost::asio::io_service io_services;
tcp::resolver resolvers(io_services); 
tcp::socket socks(io_services);
boost::system::error_code ec;
 
tcp::resolver::query querys("www.games.ru", 80);
tcp::resolver::iterator iteratorka = resolvers.async_resolve(querys, ec); // Но тут VS2017 говорит, что "не существует подходящего конструктора преобразования из "void" в boost_asio::ip::basic_resolver_iterator<boost::asio::ip::tcp>"
tcp::endpoint endo_pointo = *iteratorka;
 
socks.async_connect(endo_pointo);
string message = "Hello world";
async_write(socks, boost::asio::buffer(message));
 
io_services.run();
Android1 вне форума Ответить с цитированием
Старый 04.08.2019, 11:58   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Ну вы же бред написали. Если хотите синхронности, пишите синхронные методы. Асинхронный метод отработает и позовет ваш колбек с результатом, когда закончит.
p51x на форуме Ответить с цитированием
Старый 04.08.2019, 13:00   #5
Android1
Форумчанин
 
Регистрация: 26.08.2010
Сообщений: 121
По умолчанию

Подскажите пожалуйста, ну в чем бред ?
Ну пусть асинхронный метод отработает и позовет ваш колбек с результатом, когда закончит, но код даже не запускается.
Серьезно не понимаю в чем ошибка ?
Android1 вне форума Ответить с цитированием
Старый 04.08.2019, 13:29   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Значит вы просто не знаете разницы между синхронным и асинхронным кодом.

Код:
tcp::resolver::iterator iteratorka = resolvers.async_resolve(querys, ec);
Какой колбек надо будет позвать?
Что произойдет в момент resolvers.async_resolve? Просто запустится функция и управление сразу вернется.
Что должно присвоится iteratorka, если код функции, возможно, даже еще не начал выполняться?

Я еще раз повторю: любо сначала разбиритесь что вообще такое асинхронность, либо просто пишите синхронный код, т.к. по вашему коду не видно нафига вам вообще асинхронность...
p51x на форуме Ответить с цитированием
Старый 04.08.2019, 13:52   #7
Android1
Форумчанин
 
Регистрация: 26.08.2010
Сообщений: 121
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Что должно присвоится iteratorka, если код функции, возможно, даже еще не начал выполняться?
По идее результатом функции resolve должен быть некий пул адресов или ошибка (к примеру host_not_found), но Вы написали, что должно присвоиться, если коде еще даже еще не начал выполняться.
Ну по идее это может быть должен быть некий кол-бэк, по которому будет прерывание, и весь остальной код встанет на паузу и управление опять вернется к async_resolve.
Блин я запутался (((
Android1 вне форума Ответить с цитированием
Старый 04.08.2019, 14:05   #8
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
Сообщение от Android1 Посмотреть сообщение
По идее результатом функции resolve должен быть некий пул адресов или ошибка (к примеру host_not_found)
Смотрим, что функция возвращает в качестве результата:
Код:
(const boost::system::error_code& err,
      tcp::resolver::iterator endpoint_iterator)
ой, да это же ошибка и список результатов...

Цитата:
Сообщение от Android1 Посмотреть сообщение
но Вы написали, что должно присвоиться, если коде еще даже еще не начал выполняться
Именно, или вы пишите асинхронный код и даже не знаете и не понимаете, что это такое?

Цитата:
Сообщение от Android1 Посмотреть сообщение
Ну по идее это может быть должен быть некий кол-бэк, по которому будет прерывание, и весь остальной код встанет на паузу и управление опять вернется к async_resolve.
Вы сейчас описали вариант реализации через фьюче и промис. Только зачем опять возвращаться к async_resolve?
p51x на форуме Ответить с цитированием
Старый 04.08.2019, 14:24   #9
Android1
Форумчанин
 
Регистрация: 26.08.2010
Сообщений: 121
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Только зачем опять возвращаться к async_resolve?
Ну по идее именно async_resolve не нужно, потому что если вызван колбэк, то результат значит уже получен.
Android1 вне форума Ответить с цитированием
Старый 05.08.2019, 14:16   #10
Android1
Форумчанин
 
Регистрация: 26.08.2010
Сообщений: 121
По умолчанию

А я немного(много) не пойму:

Код:
void handle_resolve(const boost::system::error_code& err,
      tcp::resolver::iterator endpoint_iterator)
Это, как я понимаю функция для кол бэка ? Если да, то получается, что в эту функцию передается по ссылке &err и endpoint_iterator(только как, по значени?), но ведь чтобы передать, что то в функцию это сначало нужно создать/обьявить.
А не err, не endpoint_itetator не созданы, как тогда они передаются ?
Android1 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Boost] ASIO Buffer S.Ruslan C/C++ Сетевое программирование 7 25.03.2019 13:34
boost/asio MayhemWithMercy C/C++ Сетевое программирование 1 11.06.2014 17:44
boost ASIO сериализация Kukurudza Общие вопросы C/C++ 2 06.12.2011 13:38
Boost::Asio on Mingw russian-stalker Общие вопросы C/C++ 0 05.01.2011 16:27
Boost (asio + thread) - noncopyable MInner Общие вопросы C/C++ 1 06.12.2009 16:41