Skip to content

asio::ip::tcp::resolver::async_resolve cannot be cancelled #1721

@username-nullptr

Description

@username-nullptr

After calling "cancel()", "resolver.async_resolve()" will not return immediately. It will remain blocked until the operation is successful. The result of "error.message()" will be "Success", and "result" will not be empty.
Whether it is "use_awaitable" or callback functions, they cannot be cancelled.

`#include <asio.hpp>

int main()
{
using namespace std::chrono_literals;
asio::io_context ioc;

asio::ip::tcp::resolver resolver {ioc};
asio::cancellation_signal signal;

asio::co_spawn(ioc, [&]() -> asio::awaitable<void>
{
	std::error_code error;
	auto result = co_await resolver.async_resolve (
		"www.baidu.com", "",
		// asio::bind_cancellation_slot(signal.slot(), asio::redirect_error(libgs::use_awaitable, error))
		asio::redirect_error(asio::use_awaitable, error)
	);
	std::cerr << error.message() << std::endl;
	ioc.stop();
	co_return ;
},
asio::detached);

asio::steady_timer timer {ioc, 1s};
timer.async_wait([&](std::error_code)
{
	std::cout << "cancel" << std::endl;
	// signal.emit(asio::cancellation_type::all);
	resolver.cancel();
});

asio::executor_work_guard<asio::io_context::executor_type>
	work {ioc.get_executor()};
ioc.run();
return 0;

}`

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions