0%

[boost.asio] 1.basic introduction of boost asio

Boost.Asio 可在I/O对象(如socket)中进行同步(synchronous)和异步(asynchronous)操作。 接下来,以一个基于同步的I/O socket连接操作为例:

在program中,至少需要有一个 I/0 execution context,如boost::asio::io_context, boost::asio::thread_pool, or boost::asio::system_context

该boost::asio::io_context表明已经连接到操作系统的 I/O services上。

1
boost::asio::io_context io_context;

program进行I/O操作,必须有一个 I/O object 如 TCP socket:

1
boost::asio::ip::tcp::socket socket(io_context);

同步连接操作相关事件#

进行同步连接操作是,如下事件按顺序触发 1. 通过调用 I/O object,进行初始化连接

1
socket.connect(server_endpoint);
2. I/O object 请求 I/O execution context 3. I/O execution context 调用操作系统,进行连接操作。 4. 操作系统返回 操作返回值 给 I/O execution context 5. I/O execution context将 操作系统返回的结果 转换为boost::system::error_code 对象。然后返回该结果给 I/O object。 6. 若操作失败, I/O object 抛出 boost::system::system_error类型的异常。 若初始化操作的code 为:
1
2
boost::system::error_code ec;
socket.connect(server_endpoint, ec);
返回结果设置到 类型为error_code的变量ec, I/O object不会抛出异常。

异步连接操作相关事件#

  1. 通过调用 I/O object,进行初始化连接

    1
    socket.async_connect(server_endpoint, your_completion_handler);
    其中 **_completion_handler** 是一个带有签名(signature)的函数 or 函数对象
    1
    void your_completion_handler(const boost::system::error_code& ec);
    这个签名(signature) 取决于正在进行的 异步操作。

  2. I/O object 请求 I/O execution context

  3. I/O execution context 给操作系统发signals,通知操作系统进行异步连接。

  4. 操作系统完成连接操作后,将结果加入到队列,等待I/O execution context处理。

  5. 当使用 io_context 作为 I/O execution context时, 需要运行io_context::run(),获取返回的结果。当有未完成的异步操作时,不能运行 io_context::run()。因此需要在首次进行异步连接操作时,就运行io_context::run()。

  6. 在 io_context::run() 里,I/O execution context 将处理队列中的返回结果,将其翻译成 error_code,然后传给 completion handler(回调)

reference#

  1. (Basic Boost.Asio Anatomy)[https://www.boost.org/doc/libs/1_75_0/doc/html/boost_asio/overview/core/basics.html]