2015-07-08 2 views
1

Из стандарта SSL client пример. Я называю эту функцию.Отмена соединения повышается :: asio

boost::asio::async_connect(socket_.lowest_layer(), endpoint_iterator, 
           boost::bind(&SSLClient::handle_connect, this, 
              boost::asio::placeholders::error)); 

Но тогда функция вызывается, и программа подключается. Я хотел бы отменить свой запрос и прекратить соединение! Как я могу это сделать?

Специальный чехол: скажем, что у меня есть эти объекты в потоке. Есть ли способ сделать это в этом случае?

Теперь, если я попытаюсь это сделать, программа просто не отвечает. Я не вижу способа заставить его остановиться!

+0

«Теперь, если я попытаюсь сделать это» - делать то, что? – sehe

ответ

0

Существует несколько способов достижения желаемого.

  1. Вы можете остановить службу (service.stop()). Но это не дает вам контроля над всеми работающими операциями. Это так называемый «ядерный» подход.

  2. контролируемым способом было бы назвать cancel()

    Отменить все асинхронные операции, связанные с гнездом.

    socket_.cancel() 
    

Теперь у вас есть дополнительная задача поддержания жизни вашего объекта соединения (предположительно this в вашем связанном обработчике завершения). Очень распространенный шаблон для использования заключается в том, чтобы сделать класс соединения производным от enable_shared_from_this и привязать обработчик завершения к shared_from_this() вместо this.

Таким образом, общий объект соединения автоматически «уходит» после того, как последняя ожидающая операция async была отменена, и вам не нужно беспокоиться о утечке объектов подключения.

¹ хватает exit, abort, quick_exit и т.д. :)

Смежные вопросы