asio简介

asio可以进行io对象(比如socket套接字)进行同步操作和异步操作。 在使用Asio之前,对Asio的各个部分、你的程序以及它们是如何一起工作的有个概念的了解是很有用的。作为一个介绍性的例子,让我们考虑一下在套接字上执行连接操作时会发生什么。

一、我们将从研究同步操作开始

你的程序至少会有一个I/O执行上下文,比如asio::io_context对象,asio::thread_pool对象,或者asio::system_context。这个I/O执行上下文表示程序到操作系统I/O服务的链接。

asio::io_context io_context;

要执行I/O操作,你的程序需要一个I/O对象,比如一个TCP套接字:

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

当执行同步连接操作时,会发生以下事件序列:

1. 你的程序通过调用I/O对象来启动连接操作

socket.connect(server_endpoint);

2. I/O对象将请求转发给I/O执行上下文

3.I/O执行上下文调用操作系统来执行连接操作。

4. 操作系统将操作的结果返回给I/O执行上下文。

5. I/O执行上下文将操作产生的任何错误转换为asio::error_code类型的对象。error_code可以与特定的值进行比较,或者作为布尔值进行比较(如果结果为假,则表示没有发生错误)。然后将结果转发回I/O对象

6. 如果操作失败,I/O对象会抛出一个asio::system_error类型的异常。如果初始化操作的代码被写成:

asio::error_code ec;
socket.connect(server_endpoint, ec);

然后error_code变量ec将被设置为操作的结果,并且不会抛出异常。

二、当使用异步操作时,会发生不同的事件序列

1. 你的程序通过调用I/O对象来初始化连接操作

socket.async_connect(server_endpoint, your_completion_handler);

其中your_completion_handler是一个带有签名的函数或函数对象:

void your_completion_handler(const asio::error_code& ec);

 所需的确切签名取决于正在执行的异步操作。参考文档指出了每个操作的适当形式。

2. I/O对象将请求转发给I/O执行上下文。

3.I/O执行上下文向操作系统发出信号,说明它应该启动异步连接。

 

4. 操作系统通过将结果放置在一个队列中表示连接操作已经完成,准备由I/O执行上下文获取

5. 当使用io_context作为I/O执行上下文时,你的程序必须调用io_context::run()(或类似的io_context成员函数)以便检索结果。当有未完成的异步操作时,调用io_context::run()会阻塞,所以你通常会在你开始第一个异步操作时调用它

6. 在调用io_context::run()时,I/O执行上下文会将操作的结果从队列中取出,转换成一个error_code,然后将其传递给完成处理程序

三、总述

这是Asio运作方式的简单介绍。 如果你的需求更高级,比如扩展Asio来执行其他类型的异步操作,你会想要更深入地研究文档。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值