翻译:Boost.Asio基础剖析

 

Basic Boost.Asio Anatomy
Boost.Asio基础剖析

Boost.Asio may be used to perform both synchronous and asynchronous operations on I/O objects such as sockets. Before using Boost.Asio it may be useful to get a conceptual picture of the various parts of Boost.Asio, your program, and how they work together.

Boost.Asio可用于在诸如socket对象上执行同步和异步操作。在使用Boost.Asio之前,了解一下Boost.Asio和你的程序的各个部分的概念图,以及它们如何一起工作,是非常有用的,

As an introductory example, let's consider what happens when you perform a connect operation on a socket. We shall start by examining synchronous operations.

作为一个入门例子,让我们了解一下,当你在执行一个socket连接时,发生了什么情况。这里我们将开始研究同步操作。

sync_op

Your program will have at least one io_service object. The io_service represents your program's link to the operating system's I/O services.

你的程序将至少有一个 io_service 对象,这个 io_service代表了你的程序到操作系统的

I/O服务的连接。

boost::asio::io_service io_service;

To perform I/O operations your program will need an I/O object such as a TCP socket:

为了执行I/O操作,你的程序需要一个 I/O对象,如TCP socket:

boost::asio::ip::tcp::socket socket(io_service);

When a synchronous connect operation is performed, the following sequence of events occurs:

当异步连接操作执行时,下列事件顺次发生:

1.        Your program initiates the connect operation by calling the I/O object:

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

socket.connect(server_endpoint);

2. The I/O object forwards the request to the io_service.

I/O转发请求到io_service.

3. The io_service calls on the operating system to perform the connect operation.

io_service调用操作系统执行连接操作

4. The operating system returns the result of the operation to the io_service.

操作系统返回操作结果给 io_service

5. The io_service translates any error resulting from the operation into a  boost::system::error_code. An error_code may be compared with specific values, or tested as a boolean (where a false result means that no error occurred). The result is then forwarded back up to the I/O object.

 io_service将任何错误代码转换为boost::system::error_code,这个error_code可以和特定值比较,也可作为boolean测试(false表示没有错误发生)。结果然后转发回 I/O对象

6. The I/O object throws an exception of type boost::system::system_error if the operation failed. If the code to initiate the operation had instead been written as:

如果操作失败, I/O对象抛出boost::system::system_error类型的异常。如果初始化操作的代码按下面的方式书写:

boost::system::error_code ec;
socket.connect(server_endpoint, ec);

then the error_code variable ec would be set to the result of the operation, and no exception would be thrown.

那么 error_code 变量 ec将被设置为操作的结果,并且没有异常抛出。

When an asynchronous operation is used, a different sequence of events occurs.

当使用异步操作时,将是不同的事件产生顺序

async_op1

1.        Your program initiates the connect operation by calling the I/O object:

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

socket.async_connect(server_endpoint, your_completion_handler);

where your_completion_handler is a function or function object with the signature:

这里your_completion_handler是一个带有signature (目标识别特征)的函数或函数对象:

void your_completion_handler(const boost::system::error_code& ec);

The exact signature required depends on the asynchronous operation being performed. The reference documentation indicates the appropriate form for each operation.

确切的signature (目标识别特征)根据执行的异步操作的不同而不同,参考文档为每个操作列出了正确的形式。

2.        The I/O object forwards the request to the io_service.

 I/O对象将请求转发给io_service

3.        The io_service signals to the operating system that it should start an asynchronous connect.

io_service通知操作系统,告诉操作系统启动一个异步连接

Time passes. (In the synchronous case this wait would have been contained entirely within the duration of the connect operation.)

过一段时间。(在同步操作的情况下,这个等待是整个连接操作的时间)

async_op2

4. The operating system indicates that the connect operation has completed by placing the result on a queue, ready to be picked up by the io_service.

操作系统通过在队列里放置一个结果来指示连接操作已经完成,这个结果等待io_service来取。

5. Your program must make a call to io_service::run() (or to one of the similar io_service member functions) in order for the result to be retrieved. A call toio_service::run() blocks while there are unfinished asynchronous operations, so you would typically call it as soon as you have started your first asynchronous operation.

为了确保结果能够被收到,你的程序必须调用io_service::run()(或相似的io_service成员函数)。当有未完成的操作时,io_service::run()的调用被阻塞,所以你要在第一次启动异步操作后尽快调用io_service::run()

6. While inside the call to io_service::run(), the io_service dequeues the result of the operation, translates it into an error_code, and then passes it to your completion handler.

io_service::run()内部, io_service 从队列移除操作结果,转换为 error_code,并传递给your completion handler

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值