Boost.Asio取消异步操作

在异步编程中, 如果某些条件不满足, 或者用户想强制取消某些IO操作, 此时也需要终止启动的异步操作. 下面给出一个常用的方法.

#include <boost/asio.hpp>
#include <iostream>
#include <thread>
#include <memory>
#include <chrono>

using namespace boost;

int main() {
    std::string raw_ip_address = "127.0.0.1";
    unsigned short port_num = 6768;
    try {
        asio::ip::tcp::endpoint ep(
                asio::ip::address::from_string(raw_ip_address),
                port_num
        );

        asio::io_context ioc;
        std::shared_ptr<asio::ip::tcp::socket> sock(
                new asio::ip::tcp::socket(ioc, ep.protocol())
        );

        sock->async_connect(ep,
                            [sock](const boost::system::error_code &ec) {
                                if (ec.value() != 0) {
                                    if (ec == asio::error::operation_aborted) {
                                        std::cout << "Operation cancelled!\n";
                                    } else {
                                        std::cout << "Error occurred!"
                                                  << " Error code = "
                                                  << ec.value()
                                                  << ". Message: "
                                                  << ec.message();
                                    }
                                }
                                return;
                            });
        // 运行Boost.Asio的事件循环, 在新的线程启动
        std::thread worker_thread([&ioc]() {
            try {
                ioc.run();
            } catch (boost::system::system_error &e) {
                std::cout << "Error occurred!"
                          << " Error code = " << e.code()
                          << ". Message: " << e.what();
            }
        });
        // 模拟处理其它任务
        std::this_thread::sleep_for(std::chrono::seconds(2));
        sock->cancel();  // 这里会启动异步回调函数
        worker_thread.join();
    } catch (boost::system::system_error &e) {
        std::cout << "Main Error occurred! Error code = " << e.code()
                  << ". Message: " << e.what();
        return e.code().value();
    }
    return 0;
}

输出结果:

Error occurred! Error code = 111. Message: Connection refused

上述代码中, io_context在新线程启动的原理可以参考这个笔记

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值