Отмена подключения — это Boost :: Asio

От стандарта Клиент SSL пример. Скажем, я называю эту функцию.

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

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

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

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

1

Решение

Есть несколько способов достичь того, что вы хотите ¹.

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

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

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

    socket_.cancel()
    

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

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

¹ не хватает exit, abort, quick_exit так далее. 🙂

0

Другие решения


По вопросам рекламы [email protected]