| <html> |
| <head> |
| <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> |
| <title>Basic Boost.Asio Anatomy</title> |
| <link rel="stylesheet" href="../../../../../doc/src/boostbook.css" type="text/css"> |
| <meta name="generator" content="DocBook XSL Stylesheets V1.75.2"> |
| <link rel="home" href="../../../boost_asio.html" title="Boost.Asio"> |
| <link rel="up" href="../core.html" title="Core Concepts and Functionality"> |
| <link rel="prev" href="../core.html" title="Core Concepts and Functionality"> |
| <link rel="next" href="async.html" title="The Proactor Design Pattern: Concurrency Without Threads"> |
| </head> |
| <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> |
| <table cellpadding="2" width="100%"><tr> |
| <td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../boost.png"></td> |
| <td align="center"><a href="../../../../../index.html">Home</a></td> |
| <td align="center"><a href="../../../../../libs/libraries.htm">Libraries</a></td> |
| <td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> |
| <td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> |
| <td align="center"><a href="../../../../../more/index.htm">More</a></td> |
| </tr></table> |
| <hr> |
| <div class="spirit-nav"> |
| <a accesskey="p" href="../core.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../core.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../boost_asio.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="async.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a> |
| </div> |
| <div class="section"> |
| <div class="titlepage"><div><div><h4 class="title"> |
| <a name="boost_asio.overview.core.basics"></a><a class="link" href="basics.html" title="Basic Boost.Asio Anatomy">Basic Boost.Asio Anatomy</a> |
| </h4></div></div></div> |
| <p> |
| 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. |
| </p> |
| <p> |
| 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. |
| </p> |
| <p> |
| <span class="inlinemediaobject"><img src="../../sync_op.png" alt="sync_op"></span> |
| </p> |
| <p> |
| <span class="bold"><strong>Your program</strong></span> will have at least one <span class="bold"><strong>io_service</strong></span> object. The <span class="bold"><strong>io_service</strong></span> |
| represents <span class="bold"><strong>your program</strong></span>'s link to the |
| <span class="bold"><strong>operating system</strong></span>'s I/O services. |
| </p> |
| <pre class="programlisting"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">asio</span><span class="special">::</span><span class="identifier">io_service</span> <span class="identifier">io_service</span><span class="special">;</span> |
| </pre> |
| <p> |
| To perform I/O operations <span class="bold"><strong>your program</strong></span> |
| will need an <span class="bold"><strong>I/O object</strong></span> such as a TCP |
| socket: |
| </p> |
| <pre class="programlisting"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">asio</span><span class="special">::</span><span class="identifier">ip</span><span class="special">::</span><span class="identifier">tcp</span><span class="special">::</span><span class="identifier">socket</span> <span class="identifier">socket</span><span class="special">(</span><span class="identifier">io_service</span><span class="special">);</span> |
| </pre> |
| <p> |
| When a synchronous connect operation is performed, the following sequence |
| of events occurs: |
| </p> |
| <p> |
| 1. <span class="bold"><strong>Your program</strong></span> initiates the connect |
| operation by calling the <span class="bold"><strong>I/O object</strong></span>: |
| </p> |
| <pre class="programlisting"><span class="identifier">socket</span><span class="special">.</span><span class="identifier">connect</span><span class="special">(</span><span class="identifier">server_endpoint</span><span class="special">);</span> |
| </pre> |
| <p> |
| 2. The <span class="bold"><strong>I/O object</strong></span> forwards the request |
| to the <span class="bold"><strong>io_service</strong></span>. |
| </p> |
| <p> |
| 3. The <span class="bold"><strong>io_service</strong></span> calls on the <span class="bold"><strong>operating system</strong></span> to perform the connect operation. |
| </p> |
| <p> |
| 4. The <span class="bold"><strong>operating system</strong></span> returns the result |
| of the operation to the <span class="bold"><strong>io_service</strong></span>. |
| </p> |
| <p> |
| 5. The <span class="bold"><strong>io_service</strong></span> translates any error |
| resulting from the operation into a <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">system</span><span class="special">::</span><span class="identifier">error_code</span></code>. |
| An <code class="computeroutput"><span class="identifier">error_code</span></code> may be compared |
| with specific values, or tested as a boolean (where a <code class="computeroutput"><span class="keyword">false</span></code> |
| result means that no error occurred). The result is then forwarded back |
| up to the <span class="bold"><strong>I/O object</strong></span>. |
| </p> |
| <p> |
| 6. The <span class="bold"><strong>I/O object</strong></span> throws an exception |
| of type <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">system</span><span class="special">::</span><span class="identifier">system_error</span></code> if the operation failed. |
| If the code to initiate the operation had instead been written as: |
| </p> |
| <pre class="programlisting"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">system</span><span class="special">::</span><span class="identifier">error_code</span> <span class="identifier">ec</span><span class="special">;</span> |
| <span class="identifier">socket</span><span class="special">.</span><span class="identifier">connect</span><span class="special">(</span><span class="identifier">server_endpoint</span><span class="special">,</span> <span class="identifier">ec</span><span class="special">);</span> |
| </pre> |
| <p> |
| then the <code class="computeroutput"><span class="identifier">error_code</span></code> variable |
| <code class="computeroutput"><span class="identifier">ec</span></code> would be set to the |
| result of the operation, and no exception would be thrown. |
| </p> |
| <p> |
| When an asynchronous operation is used, a different sequence of events |
| occurs. |
| </p> |
| <p> |
| <span class="inlinemediaobject"><img src="../../async_op1.png" alt="async_op1"></span> |
| </p> |
| <p> |
| 1. <span class="bold"><strong>Your program</strong></span> initiates the connect |
| operation by calling the <span class="bold"><strong>I/O object</strong></span>: |
| </p> |
| <pre class="programlisting"><span class="identifier">socket</span><span class="special">.</span><span class="identifier">async_connect</span><span class="special">(</span><span class="identifier">server_endpoint</span><span class="special">,</span> <span class="identifier">your_completion_handler</span><span class="special">);</span> |
| </pre> |
| <p> |
| where <code class="computeroutput"><span class="identifier">your_completion_handler</span></code> |
| is a function or function object with the signature: |
| </p> |
| <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">your_completion_handler</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">system</span><span class="special">::</span><span class="identifier">error_code</span><span class="special">&</span> <span class="identifier">ec</span><span class="special">);</span> |
| </pre> |
| <p> |
| The exact signature required depends on the asynchronous operation being |
| performed. The reference documentation indicates the appropriate form for |
| each operation. |
| </p> |
| <p> |
| 2. The <span class="bold"><strong>I/O object</strong></span> forwards the request |
| to the <span class="bold"><strong>io_service</strong></span>. |
| </p> |
| <p> |
| 3. The <span class="bold"><strong>io_service</strong></span> signals to the <span class="bold"><strong>operating system</strong></span> that it should start an asynchronous |
| connect. |
| </p> |
| <p> |
| Time passes. (In the synchronous case this wait would have been contained |
| entirely within the duration of the connect operation.) |
| </p> |
| <p> |
| <span class="inlinemediaobject"><img src="../../async_op2.png" alt="async_op2"></span> |
| </p> |
| <p> |
| 4. The <span class="bold"><strong>operating system</strong></span> indicates that |
| the connect operation has completed by placing the result on a queue, ready |
| to be picked up by the <span class="bold"><strong>io_service</strong></span>. |
| </p> |
| <p> |
| 5. <span class="bold"><strong>Your program</strong></span> must make a call to <code class="computeroutput"><span class="identifier">io_service</span><span class="special">::</span><span class="identifier">run</span><span class="special">()</span></code> |
| (or to one of the similar <span class="bold"><strong>io_service</strong></span> member |
| functions) in order for the result to be retrieved. A call to <code class="computeroutput"><span class="identifier">io_service</span><span class="special">::</span><span class="identifier">run</span><span class="special">()</span></code> |
| blocks while there are unfinished asynchronous operations, so you would |
| typically call it as soon as you have started your first asynchronous operation. |
| </p> |
| <p> |
| 6. While inside the call to <code class="computeroutput"><span class="identifier">io_service</span><span class="special">::</span><span class="identifier">run</span><span class="special">()</span></code>, the <span class="bold"><strong>io_service</strong></span> |
| dequeues the result of the operation, translates it into an <code class="computeroutput"><span class="identifier">error_code</span></code>, and then passes it to <span class="bold"><strong>your completion handler</strong></span>. |
| </p> |
| <p> |
| This is a simplified picture of how Boost.Asio operates. You will want |
| to delve further into the documentation if your needs are more advanced, |
| such as extending Boost.Asio to perform other types of asynchronous operations. |
| </p> |
| </div> |
| <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> |
| <td align="left"></td> |
| <td align="right"><div class="copyright-footer">Copyright © 2003 - 2010 Christopher M. Kohlhoff<p> |
| Distributed under the Boost Software License, Version 1.0. (See accompanying |
| file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) |
| </p> |
| </div></td> |
| </tr></table> |
| <hr> |
| <div class="spirit-nav"> |
| <a accesskey="p" href="../core.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../core.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../boost_asio.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="async.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a> |
| </div> |
| </body> |
| </html> |