简介

  • Asio常用的类

Asio asio::io_context 详解

asio::io_context 是 Boost.Asio 库(也是 C++ 标准库中的一部分,自 C++17 起)中的核心类之一。它是实现异步 I/O 操作的关键部分,用于驱动异步事件处理。

作用:

  • 提供 I/O 上下文: io_context 对象是异步操作的执行上下文,用于管理异步操作、事件处理、任务队列和事件循环。
  • 事件驱动: 通过 io_context,可以注册异步操作(如套接字操作、定时器事件等),io_context 将在合适的时机进行调度、执行和完成这些异步操作。

主要功能和方法:

  • run() 开始 io_context 上的事件循环,处理已注册的所有异步操作,直到所有操作完成或 io_context 被停止。
  • stop() 停止 io_context 上的事件循环。停止后,run() 函数将在处理完当前已注册的操作后立即返回。
  • poll() 执行 io_context 上的事件循环,但仅处理当前可立即完成的操作,然后立即返回。
  • restart() 重新启动已经停止的 io_context

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <boost/asio.hpp>

int main() {
    boost::asio::io_context io_context;

    // 创建一个定时器
    boost::asio::steady_timer timer(io_context, boost::asio::chrono::seconds(5));

    // 异步等待定时器完成
    timer.async_wait([](const boost::system::error_code& ec) {
        if (!ec) {
            std::cout << "Timer expired!" << std::endl;
        }
    });

    // 运行 io_context 上的事件循环,直到所有操作完成
    io_context.run();

    return 0;
}

在上述示例中,io_context 用于驱动异步操作(这里是一个定时器异步等待)。通过调用 run() 方法,io_context 开始处理已注册的异步操作,并在完成所有操作或者遇到停止指令时返回。

io_context 是 Boost.Asio 中非常重要的一个类,它为异步操作提供了执行环境,能够有效地管理和调度异步事件,是异步编程的核心。

Asio asio::thread_pool 详解

asio::thread_pool 是 Boost.Asio 库中的一个类,它提供了一个线程池,用于管理和执行异步操作。线程池是一种用于管理线程的技术,它可以预先创建一组线程,以便在需要时执行任务或处理异步操作。

主要作用:

  • 管理线程: asio::thread_pool 提供了线程池,可用于执行异步操作,避免了频繁创建和销毁线程的开销。
  • 处理异步操作: 可以将异步操作(如定时器、套接字操作等)提交给线程池,线程池会自动将其分配到可用的线程上执行。

主要方法和功能:

  • asio::thread_pool(size_t num_threads) 构造函数: 创建具有指定数量线程的线程池。
  • ~thread_pool() 析构函数: 销毁线程池,等待所有线程执行完毕并释放资源。
  • submit(Function && function) 提交任务到线程池,执行 function 函数。
  • stop() 停止线程池,不再接受新的任务,等待所有任务执行完毕后销毁线程池。
  • join() 阻塞等待线程池中的所有任务执行完成。
  • notify_one()notify_all() 用于唤醒正在等待的线程。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <boost/asio/thread_pool.hpp>
#include <boost/asio/post.hpp>

void task() {
    std::cout << "Task executed in thread: " << std::this_thread::get_id() << std::endl;
}

int main() {
    boost::asio::thread_pool pool(4); // 创建有4个线程的线程池

    // 提交任务到线程池
    for (int i = 0; i < 8; ++i) {
        boost::asio::post(pool, task);
    }

    // 等待所有任务完成
    pool.join();

    return 0;
}

在上述示例中,创建了一个具有 4 个线程的线程池 pool,然后向线程池提交了 8 个任务。这些任务会被线程池中的线程异步执行。最后,调用 pool.join() 阻塞等待所有任务执行完成。

asio::thread_pool 提供了一种有效地管理和执行异步操作的方式,避免了线程频繁创建和销毁的开销,并提高了异步操作的执行效率。

Asio asio::ip::tcp::socket 详解

asio::ip::tcp::socket 是 Boost.Asio 库中用于 TCP 协议的套接字类,用于在 C++ 中进行 TCP 网络通信。

主要作用:

  • 实现 TCP 客户端和服务器: asio::ip::tcp::socket 允许 C++ 应用程序创建 TCP 客户端或服务器套接字,并进行数据传输。

主要方法和功能:

  • constructor 构造函数: 创建 TCP 套接字。
  • open() 打开套接字。
  • close() 关闭套接字。
  • connect() 用于客户端,连接到远程服务器。
  • async_connect() 异步连接到远程服务器。
  • bind() 将套接字与本地端口或地址绑定。
  • async_bind() 异步绑定套接字。
  • listen() 在服务器上监听传入连接请求。
  • accept() 接受传入的连接请求。
  • async_accept() 异步接受传入的连接请求。
  • read_some()write_some() 同步读取和写入数据。
  • async_read_some()async_write_some() 异步读取和写入数据。
  • shutdown() 关闭套接字的输入、输出或全部流。

示例(简化的服务器端):

下面是一个简化的 Boost.Asio TCP 服务器端示例,展示了如何使用 asio::ip::tcp::socket 接受连接和读取数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <iostream>
#include <boost/asio.hpp>

using boost::asio::ip::tcp;

int main() {
    boost::asio::io_context io_context;
    tcp::acceptor acceptor(io_context, tcp::endpoint(tcp::v4(), 8080));

    while (true) {
        tcp::socket socket(io_context);
        acceptor.accept(socket);

        std::array<char, 128> buffer;
        boost::system::error_code error;

        // 读取数据
        size_t len = socket.read_some(boost::asio::buffer(buffer), error);
        if (error == boost::asio::error::eof) {
            std::cout << "Connection closed by peer." << std::endl;
        } else if (error) {
            std::cerr << "Error: " << error.message() << std::endl;
        } else {
            std::cout << "Received data: " << std::string(buffer.data(), len) << std::endl;
        }
    }

    return 0;
}

asio::ip::tcp::socket 是 Boost.Asio 中用于 TCP 通信的关键类之一,提供了处理 TCP 套接字的方法和功能,可以用于创建 TCP 客户端或服务器,并进行数据的读写操作。

Asio asio::steady_timer详解

asio::steady_timer 是 Boost.Asio 库中的一个定时器类,用于在指定时间点执行或触发操作。

主要作用:

  • 定时触发事件: asio::steady_timer 用于创建定时器对象,可以在设定的时间点之后触发回调函数。

主要方法和功能:

  • constructor 构造函数: 创建定时器对象。
  • expires_at()expires_from_now() 分别设置定时器的到期时间和到期时刻的相对偏移量。
  • async_wait() 异步等待定时器触发。可以向定时器对象提交一个回调函数,在指定时间点触发回调。
  • cancel() 取消定时器,终止尚未触发的操作。
  • wait() 阻塞等待定时器触发。

示例:

下面是一个简单的 Boost.Asio 定时器示例,演示了 asio::steady_timer 的基本用法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <boost/asio.hpp>

void timer_handler(const boost::system::error_code& ec) {
    if (!ec) {
        std::cout << "Timer expired!" << std::endl;
    }
}

int main() {
    boost::asio::io_context io_context;
    boost::asio::steady_timer timer(io_context, boost::asio::chrono::seconds(5));

    // 异步等待定时器触发,并指定回调函数
    timer.async_wait(timer_handler);

    // 运行 io_context 上的事件循环
    io_context.run();

    return 0;
}

在上述示例中,创建了一个 asio::steady_timer 对象 timer,设置定时器在 5 秒后触发。然后使用 timer.async_wait() 异步等待定时器的触发,并指定了一个回调函数 timer_handler。最后,调用 io_context.run() 运行事件循环,等待定时器触发并执行回调函数。

asio::steady_timer 类是 Boost.Asio 中用于管理定时器的重要类之一,允许程序在指定的时间点执行特定操作,通常用于实现定时任务、超时控制等功能。