Boost.Asio 的使用
Boost.Asio 库
io_context
1. 概念
io_context 是 Asio 库的核心事件循环和 IO 调度器,也是所有异步 I/O 事件处理的基础。工作逻辑为
将需要监听的 IO 事件(如 socket 的读/写就绪、连接请求就绪)和对应的处理回调注册到
io_context的事件管理体系中启用
io_context的事件循环以后,会持续通过底层多路复用的机制检测已注册的事件状态……当检测到某个 IO 事件就绪以后,会自动调用执行该事件对应的上层回调函数,完成 IO 事件的处理
2. 和 epoll/iocp 的关系
io_context 是跨平台抽象层,epoll 只是其在 Linux 下的一种底层实现,类似
1 | |
用代码实现的话
注册:将代码中
tcp::acceptor(监听套接字)、tcp::socket(通信套接字)和各种事件(端口监听,socket 读/写)等事件注册到 io_context,同时绑定自定义回调;传递:
io_context接收到注册请求后,会将对应的 socket 句柄、事件类型(读 / 写 / 连接)传递给底层的 epoll,完成 epoll 的事件注册;启动:调用
io_context.run()启动事件循环,io_context会调用 epoll 的epoll_wait方法,阻塞等待内核的事件就绪通知响应处理:有事件就绪,内核通过 epoll 向
io_context发送就绪通知,然后调度执行开发者注册的上层回调函数
3. 核心特点
跨平台性:若你的服务端移植到 Windows,io_context 会自动切换为基于 IOCP 实现,你的上层代码无需任何修改,这是 io_context 最核心的价值(屏蔽了不同系统的底层 IO 差异);
不止封装 epoll:io_context 除了封装 IO 多路复用,还实现了事件调度、回调管理、线程池适配等功能,而 epoll 仅负责内核态的 IO 事件检测,无上层调度能力;