basics.qbk
来自「Boost provides free peer-reviewed portab」· QBK 代码 · 共 107 行
QBK
107 行
[/ / Copyright (c) 2003-2008 Christopher M. Kohlhoff (chris at kohlhoff dot com) / / Distributed under the Boost Software License, Version 1.0. (See accompanying / file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) /][section:basics Basic Boost.Asio Anatomy]Boost.Asio may be used to perform both synchronous and asynchronous operations on I/Oobjects such as sockets. Before using Boost.Asio it may be useful to get a conceptualpicture of the various parts of Boost.Asio, your program, and how they work together.As an introductory example, let's consider what happens when you perform aconnect operation on a socket. We shall start by examining synchronousoperations.[$boost_asio/sync_op.png][*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. boost::asio::io_service io_service;To perform I/O operations [*your program] will need an [*I/O object] such as aTCP socket: boost::asio::ip::tcp::socket socket(io_service);When a synchronous connect operation is performed, the following sequence ofevents occurs:1. [*Your program] initiates the connect operation by calling the [*I/Oobject]: socket.connect(server_endpoint);2. The [*I/O object] forwards the request to the [*io_service].3. The [*io_service] calls on the [*operating system] to perform the connectoperation.4. The [*operating system] returns the result of the operation to the[*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 specificvalues, or tested as a boolean (where a `false` result means that no erroroccurred). The result is then forwarded back up to the [*I/O object].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 beenwritten as: boost::system::error_code ec; socket.connect(server_endpoint, ec);then the `error_code` variable `ec` would be set to the result of theoperation, and no exception would be thrown.When an asynchronous operation is used, a different sequence of events occurs.[$boost_asio/async_op1.png]1. [*Your program] initiates the connect operation by calling the [*I/Oobject]: socket.async_connect(server_endpoint, your_completion_handler);where `your_completion_handler` is a function or function object with thesignature: void your_completion_handler(const boost::system::error_code& ec);The exact signature required depends on the asynchronous operation beingperformed. The reference documentation indicates the appropriate form for eachoperation.2. The [*I/O object] forwards the request to the [*io_service].3. The [*io_service] signals to the [*operating system] that it should start anasynchronous connect.Time passes. (In the synchronous case this wait would have been containedentirely within the duration of the connect operation.)[$boost_asio/async_op2.png]4. The [*operating system] indicates that the connect operation has completedby placing the result on a queue, ready to be picked up by the [*io_service].5. [*Your program] must make a call to `io_service::run()` (or to one of thesimilar [*io_service] member functions) in order for the result to beretrieved. A call to `io_service::run()` blocks while there are unfinishedasynchronous operations, so you would typically call it as soon as you havestarted your first asynchronous operation.6. While inside the call to `io_service::run()`, the [*io_service] dequeues theresult of the operation, translates it into an `error_code`, and then passes itto [*your completion handler].This is a simplified picture of how Boost.Asio operates. You will want to delvefurther into the documentation if your needs are more advanced, such asextending Boost.Asio to perform other types of asynchronous operations.[endsect]
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?