install asio headers separately to the root include

This commit is contained in:
Ruixiang Du
2020-09-14 16:00:00 +08:00
parent 9708097dce
commit 8c02f9ae3c
4858 changed files with 477764 additions and 10 deletions

BIN
include/asio/doc/asio.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

@@ -0,0 +1,61 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Examples</title>
<link rel="stylesheet" href="../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../index.html" title="Asio">
<link rel="up" href="../index.html" title="Asio">
<link rel="prev" href="tutorial/boost_bind.html" title="boost::bind">
<link rel="next" href="examples/cpp03_examples.html" title="C++03 Examples">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="tutorial/boost_bind.html"><img src="../prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../home.png" alt="Home"></a><a accesskey="n" href="examples/cpp03_examples.html"><img src="../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
<a name="asio.examples"></a><a class="link" href="examples.html" title="Examples">Examples</a>
</h2></div></div></div>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem">
<a class="link" href="examples/cpp03_examples.html" title="C++03 Examples">C++03 Examples</a>: Illustrates
the use of Asio using only C++03 language and library features. Where necessary,
the examples make use of selected Boost C++ libraries.
</li>
<li class="listitem">
<a class="link" href="examples/cpp11_examples.html" title="C++11 Examples">C++11 Examples</a>: Contains
a limited set of the C++03 Asio examples, updated to use only C++11 library
and language facilities. These examples do not make direct use of Boost
C++ libraries. To show the changes between C++03 and C++11, these examples
include a diff between the C++03 and C++11 versions.
</li>
<li class="listitem">
<a class="link" href="examples/cpp14_examples.html" title="C++14 Examples">C++14 Examples</a>: Contains
a limited set of the C++03 Asio examples, updated to use only C++14 library
and language facilities. These examples do not make direct use of Boost
C++ libraries.
</li>
<li class="listitem">
<a class="link" href="examples/cpp17_examples.html" title="C++17 Examples">C++17 Examples</a>: Selected
examples illustrating C++17 usage in conjunction with Technical Specifications.
</li>
</ul></div>
</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-2020 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="tutorial/boost_bind.html"><img src="../prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../home.png" alt="Home"></a><a accesskey="n" href="examples/cpp03_examples.html"><img src="../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,636 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>C++03 Examples</title>
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../index.html" title="Asio">
<link rel="up" href="../examples.html" title="Examples">
<link rel="prev" href="../examples.html" title="Examples">
<link rel="next" href="cpp11_examples.html" title="C++11 Examples">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="../examples.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../examples.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="cpp11_examples.html"><img src="../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="asio.examples.cpp03_examples"></a><a class="link" href="cpp03_examples.html" title="C++03 Examples">C++03 Examples</a>
</h3></div></div></div>
<h5>
<a name="asio.examples.cpp03_examples.h0"></a>
<span><a name="asio.examples.cpp03_examples.allocation"></a></span><a class="link" href="cpp03_examples.html#asio.examples.cpp03_examples.allocation">Allocation</a>
</h5>
<p>
This example shows how to customise the allocation of memory associated with
asynchronous operations.
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
<a href="../../../src/examples/cpp03/allocation/server.cpp" target="_top">../src/examples/cpp03/allocation/server.cpp</a>
</li></ul></div>
<h5>
<a name="asio.examples.cpp03_examples.h1"></a>
<span><a name="asio.examples.cpp03_examples.buffers"></a></span><a class="link" href="cpp03_examples.html#asio.examples.cpp03_examples.buffers">Buffers</a>
</h5>
<p>
This example demonstrates how to create reference counted buffers that can
be used with socket read and write operations.
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
<a href="../../../src/examples/cpp03/buffers/reference_counted.cpp" target="_top">../src/examples/cpp03/buffers/reference_counted.cpp</a>
</li></ul></div>
<h5>
<a name="asio.examples.cpp03_examples.h2"></a>
<span><a name="asio.examples.cpp03_examples.chat"></a></span><a class="link" href="cpp03_examples.html#asio.examples.cpp03_examples.chat">Chat</a>
</h5>
<p>
This example implements a chat server and client. The programs use a custom
protocol with a fixed length message header and variable length message body.
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem">
<a href="../../../src/examples/cpp03/chat/chat_message.hpp" target="_top">../src/examples/cpp03/chat/chat_message.hpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/chat/chat_client.cpp" target="_top">../src/examples/cpp03/chat/chat_client.cpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/chat/chat_server.cpp" target="_top">../src/examples/cpp03/chat/chat_server.cpp</a>
</li>
</ul></div>
<p>
The following POSIX-specific chat client demonstrates how to use the <a class="link" href="../reference/posix__stream_descriptor.html" title="posix::stream_descriptor">posix::stream_descriptor</a>
class to perform console input and output.
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
<a href="../../../src/examples/cpp03/chat/posix_chat_client.cpp" target="_top">../src/examples/cpp03/chat/posix_chat_client.cpp</a>
</li></ul></div>
<h5>
<a name="asio.examples.cpp03_examples.h3"></a>
<span><a name="asio.examples.cpp03_examples.echo"></a></span><a class="link" href="cpp03_examples.html#asio.examples.cpp03_examples.echo">Echo</a>
</h5>
<p>
A collection of simple clients and servers, showing the use of both synchronous
and asynchronous operations.
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem">
<a href="../../../src/examples/cpp03/echo/async_tcp_echo_server.cpp" target="_top">../src/examples/cpp03/echo/async_tcp_echo_server.cpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/echo/async_udp_echo_server.cpp" target="_top">../src/examples/cpp03/echo/async_udp_echo_server.cpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/echo/blocking_tcp_echo_client.cpp" target="_top">../src/examples/cpp03/echo/blocking_tcp_echo_client.cpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/echo/blocking_tcp_echo_server.cpp" target="_top">../src/examples/cpp03/echo/blocking_tcp_echo_server.cpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/echo/blocking_udp_echo_client.cpp" target="_top">../src/examples/cpp03/echo/blocking_udp_echo_client.cpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/echo/blocking_udp_echo_server.cpp" target="_top">../src/examples/cpp03/echo/blocking_udp_echo_server.cpp</a>
</li>
</ul></div>
<h5>
<a name="asio.examples.cpp03_examples.h4"></a>
<span><a name="asio.examples.cpp03_examples.fork"></a></span><a class="link" href="cpp03_examples.html#asio.examples.cpp03_examples.fork">Fork</a>
</h5>
<p>
These POSIX-specific examples show how to use Asio in conjunction with the
<code class="computeroutput">fork()</code> system call. The first example illustrates the steps
required to start a daemon process:
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
<a href="../../../src/examples/cpp03/fork/daemon.cpp" target="_top">../src/examples/cpp03/fork/daemon.cpp</a>
</li></ul></div>
<p>
The second example demonstrates how it is possible to fork a process from
within a completion handler.
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
<a href="../../../src/examples/cpp03/fork/process_per_connection.cpp" target="_top">../src/examples/cpp03/fork/process_per_connection.cpp</a>
</li></ul></div>
<h5>
<a name="asio.examples.cpp03_examples.h5"></a>
<span><a name="asio.examples.cpp03_examples.http_client"></a></span><a class="link" href="cpp03_examples.html#asio.examples.cpp03_examples.http_client">HTTP
Client</a>
</h5>
<p>
Example programs implementing simple HTTP 1.0 clients. These examples show
how to use the <a class="link" href="../reference/read_until.html" title="read_until">read_until</a>
and <a class="link" href="../reference/async_read_until.html" title="async_read_until">async_read_until</a>
functions.
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem">
<a href="../../../src/examples/cpp03/http/client/sync_client.cpp" target="_top">../src/examples/cpp03/http/client/sync_client.cpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/http/client/async_client.cpp" target="_top">../src/examples/cpp03/http/client/async_client.cpp</a>
</li>
</ul></div>
<h5>
<a name="asio.examples.cpp03_examples.h6"></a>
<span><a name="asio.examples.cpp03_examples.http_server"></a></span><a class="link" href="cpp03_examples.html#asio.examples.cpp03_examples.http_server">HTTP
Server</a>
</h5>
<p>
This example illustrates the use of asio in a simple single-threaded server
implementation of HTTP 1.0. It demonstrates how to perform a clean shutdown
by cancelling all outstanding asynchronous operations.
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem">
<a href="../../../src/examples/cpp03/http/server/connection.cpp" target="_top">../src/examples/cpp03/http/server/connection.cpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/http/server/connection.hpp" target="_top">../src/examples/cpp03/http/server/connection.hpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/http/server/connection_manager.cpp" target="_top">../src/examples/cpp03/http/server/connection_manager.cpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/http/server/connection_manager.hpp" target="_top">../src/examples/cpp03/http/server/connection_manager.hpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/http/server/header.hpp" target="_top">../src/examples/cpp03/http/server/header.hpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/http/server/main.cpp" target="_top">../src/examples/cpp03/http/server/main.cpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/http/server/mime_types.cpp" target="_top">../src/examples/cpp03/http/server/mime_types.cpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/http/server/mime_types.hpp" target="_top">../src/examples/cpp03/http/server/mime_types.hpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/http/server/reply.cpp" target="_top">../src/examples/cpp03/http/server/reply.cpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/http/server/reply.hpp" target="_top">../src/examples/cpp03/http/server/reply.hpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/http/server/request.hpp" target="_top">../src/examples/cpp03/http/server/request.hpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/http/server/request_handler.cpp" target="_top">../src/examples/cpp03/http/server/request_handler.cpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/http/server/request_handler.hpp" target="_top">../src/examples/cpp03/http/server/request_handler.hpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/http/server/request_parser.cpp" target="_top">../src/examples/cpp03/http/server/request_parser.cpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/http/server/request_parser.hpp" target="_top">../src/examples/cpp03/http/server/request_parser.hpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/http/server/server.cpp" target="_top">../src/examples/cpp03/http/server/server.cpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/http/server/server.hpp" target="_top">../src/examples/cpp03/http/server/server.hpp</a>
</li>
</ul></div>
<h5>
<a name="asio.examples.cpp03_examples.h7"></a>
<span><a name="asio.examples.cpp03_examples.http_server_2"></a></span><a class="link" href="cpp03_examples.html#asio.examples.cpp03_examples.http_server_2">HTTP
Server 2</a>
</h5>
<p>
An HTTP server using an io_context-per-CPU design.
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem">
<a href="../../../src/examples/cpp03/http/server2/connection.cpp" target="_top">../src/examples/cpp03/http/server2/connection.cpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/http/server2/connection.hpp" target="_top">../src/examples/cpp03/http/server2/connection.hpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/http/server2/header.hpp" target="_top">../src/examples/cpp03/http/server2/header.hpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/http/server2/io_context_pool.cpp" target="_top">../src/examples/cpp03/http/server2/io_context_pool.cpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/http/server2/io_context_pool.hpp" target="_top">../src/examples/cpp03/http/server2/io_context_pool.hpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/http/server2/main.cpp" target="_top">../src/examples/cpp03/http/server2/main.cpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/http/server2/mime_types.cpp" target="_top">../src/examples/cpp03/http/server2/mime_types.cpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/http/server2/mime_types.hpp" target="_top">../src/examples/cpp03/http/server2/mime_types.hpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/http/server2/reply.cpp" target="_top">../src/examples/cpp03/http/server2/reply.cpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/http/server2/reply.hpp" target="_top">../src/examples/cpp03/http/server2/reply.hpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/http/server2/request.hpp" target="_top">../src/examples/cpp03/http/server2/request.hpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/http/server2/request_handler.cpp" target="_top">../src/examples/cpp03/http/server2/request_handler.cpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/http/server2/request_handler.hpp" target="_top">../src/examples/cpp03/http/server2/request_handler.hpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/http/server2/request_parser.cpp" target="_top">../src/examples/cpp03/http/server2/request_parser.cpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/http/server2/request_parser.hpp" target="_top">../src/examples/cpp03/http/server2/request_parser.hpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/http/server2/server.cpp" target="_top">../src/examples/cpp03/http/server2/server.cpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/http/server2/server.hpp" target="_top">../src/examples/cpp03/http/server2/server.hpp</a>
</li>
</ul></div>
<h5>
<a name="asio.examples.cpp03_examples.h8"></a>
<span><a name="asio.examples.cpp03_examples.http_server_3"></a></span><a class="link" href="cpp03_examples.html#asio.examples.cpp03_examples.http_server_3">HTTP
Server 3</a>
</h5>
<p>
An HTTP server using a single io_context and a thread pool calling <code class="computeroutput">io_context::run()</code>.
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem">
<a href="../../../src/examples/cpp03/http/server3/connection.cpp" target="_top">../src/examples/cpp03/http/server3/connection.cpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/http/server3/connection.hpp" target="_top">../src/examples/cpp03/http/server3/connection.hpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/http/server3/header.hpp" target="_top">../src/examples/cpp03/http/server3/header.hpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/http/server3/main.cpp" target="_top">../src/examples/cpp03/http/server3/main.cpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/http/server3/mime_types.cpp" target="_top">../src/examples/cpp03/http/server3/mime_types.cpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/http/server3/mime_types.hpp" target="_top">../src/examples/cpp03/http/server3/mime_types.hpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/http/server3/reply.cpp" target="_top">../src/examples/cpp03/http/server3/reply.cpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/http/server3/reply.hpp" target="_top">../src/examples/cpp03/http/server3/reply.hpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/http/server3/request.hpp" target="_top">../src/examples/cpp03/http/server3/request.hpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/http/server3/request_handler.cpp" target="_top">../src/examples/cpp03/http/server3/request_handler.cpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/http/server3/request_handler.hpp" target="_top">../src/examples/cpp03/http/server3/request_handler.hpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/http/server3/request_parser.cpp" target="_top">../src/examples/cpp03/http/server3/request_parser.cpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/http/server3/request_parser.hpp" target="_top">../src/examples/cpp03/http/server3/request_parser.hpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/http/server3/server.cpp" target="_top">../src/examples/cpp03/http/server3/server.cpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/http/server3/server.hpp" target="_top">../src/examples/cpp03/http/server3/server.hpp</a>
</li>
</ul></div>
<h5>
<a name="asio.examples.cpp03_examples.h9"></a>
<span><a name="asio.examples.cpp03_examples.http_server_4"></a></span><a class="link" href="cpp03_examples.html#asio.examples.cpp03_examples.http_server_4">HTTP
Server 4</a>
</h5>
<p>
A single-threaded HTTP server implemented using stackless coroutines.
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem">
<a href="../../../src/examples/cpp03/http/server4/file_handler.cpp" target="_top">../src/examples/cpp03/http/server4/file_handler.cpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/http/server4/file_handler.hpp" target="_top">../src/examples/cpp03/http/server4/file_handler.hpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/http/server4/header.hpp" target="_top">../src/examples/cpp03/http/server4/header.hpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/http/server4/main.cpp" target="_top">../src/examples/cpp03/http/server4/main.cpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/http/server4/mime_types.cpp" target="_top">../src/examples/cpp03/http/server4/mime_types.cpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/http/server4/mime_types.hpp" target="_top">../src/examples/cpp03/http/server4/mime_types.hpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/http/server4/reply.cpp" target="_top">../src/examples/cpp03/http/server4/reply.cpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/http/server4/reply.hpp" target="_top">../src/examples/cpp03/http/server4/reply.hpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/http/server4/request.hpp" target="_top">../src/examples/cpp03/http/server4/request.hpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/http/server4/request_parser.cpp" target="_top">../src/examples/cpp03/http/server4/request_parser.cpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/http/server4/request_parser.hpp" target="_top">../src/examples/cpp03/http/server4/request_parser.hpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/http/server4/server.cpp" target="_top">../src/examples/cpp03/http/server4/server.cpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/http/server4/server.hpp" target="_top">../src/examples/cpp03/http/server4/server.hpp</a>
</li>
</ul></div>
<h5>
<a name="asio.examples.cpp03_examples.h10"></a>
<span><a name="asio.examples.cpp03_examples.icmp"></a></span><a class="link" href="cpp03_examples.html#asio.examples.cpp03_examples.icmp">ICMP</a>
</h5>
<p>
This example shows how to use raw sockets with ICMP to ping a remote host.
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem">
<a href="../../../src/examples/cpp03/icmp/ping.cpp" target="_top">../src/examples/cpp03/icmp/ping.cpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/icmp/ipv4_header.hpp" target="_top">../src/examples/cpp03/icmp/ipv4_header.hpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/icmp/icmp_header.hpp" target="_top">../src/examples/cpp03/icmp/icmp_header.hpp</a>
</li>
</ul></div>
<h5>
<a name="asio.examples.cpp03_examples.h11"></a>
<span><a name="asio.examples.cpp03_examples.invocation"></a></span><a class="link" href="cpp03_examples.html#asio.examples.cpp03_examples.invocation">Invocation</a>
</h5>
<p>
This example shows how to customise handler invocation. Completion handlers
are added to a priority queue rather than executed immediately.
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
<a href="../../../src/examples/cpp03/invocation/prioritised_handlers.cpp" target="_top">../src/examples/cpp03/invocation/prioritised_handlers.cpp</a>
</li></ul></div>
<h5>
<a name="asio.examples.cpp03_examples.h12"></a>
<span><a name="asio.examples.cpp03_examples.iostreams"></a></span><a class="link" href="cpp03_examples.html#asio.examples.cpp03_examples.iostreams">Iostreams</a>
</h5>
<p>
Two examples showing how to use <a class="link" href="../reference/ip__tcp/iostream.html" title="ip::tcp::iostream">ip::tcp::iostream</a>.
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem">
<a href="../../../src/examples/cpp03/iostreams/daytime_client.cpp" target="_top">../src/examples/cpp03/iostreams/daytime_client.cpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/iostreams/daytime_server.cpp" target="_top">../src/examples/cpp03/iostreams/daytime_server.cpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/iostreams/http_client.cpp" target="_top">../src/examples/cpp03/iostreams/http_client.cpp</a>
</li>
</ul></div>
<h5>
<a name="asio.examples.cpp03_examples.h13"></a>
<span><a name="asio.examples.cpp03_examples.multicast"></a></span><a class="link" href="cpp03_examples.html#asio.examples.cpp03_examples.multicast">Multicast</a>
</h5>
<p>
An example showing the use of multicast to transmit packets to a group of
subscribers.
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem">
<a href="../../../src/examples/cpp03/multicast/receiver.cpp" target="_top">../src/examples/cpp03/multicast/receiver.cpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/multicast/sender.cpp" target="_top">../src/examples/cpp03/multicast/sender.cpp</a>
</li>
</ul></div>
<h5>
<a name="asio.examples.cpp03_examples.h14"></a>
<span><a name="asio.examples.cpp03_examples.serialization"></a></span><a class="link" href="cpp03_examples.html#asio.examples.cpp03_examples.serialization">Serialization</a>
</h5>
<p>
This example shows how Boost.Serialization can be used with asio to encode
and decode structures for transmission over a socket.
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem">
<a href="../../../src/examples/cpp03/serialization/client.cpp" target="_top">../src/examples/cpp03/serialization/client.cpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/serialization/connection.hpp" target="_top">../src/examples/cpp03/serialization/connection.hpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/serialization/server.cpp" target="_top">../src/examples/cpp03/serialization/server.cpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/serialization/stock.hpp" target="_top">../src/examples/cpp03/serialization/stock.hpp</a>
</li>
</ul></div>
<h5>
<a name="asio.examples.cpp03_examples.h15"></a>
<span><a name="asio.examples.cpp03_examples.services"></a></span><a class="link" href="cpp03_examples.html#asio.examples.cpp03_examples.services">Services</a>
</h5>
<p>
This example demonstrates how to integrate custom functionality (in this
case, for logging) into asio's <a class="link" href="../reference/io_context.html" title="io_context">io_context</a>,
and how to use a custom service with <a class="link" href="../reference/basic_stream_socket.html" title="basic_stream_socket">basic_stream_socket&lt;&gt;</a>.
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem">
<a href="../../../src/examples/cpp03/services/basic_logger.hpp" target="_top">../src/examples/cpp03/services/basic_logger.hpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/services/daytime_client.cpp" target="_top">../src/examples/cpp03/services/daytime_client.cpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/services/logger.hpp" target="_top">../src/examples/cpp03/services/logger.hpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/services/logger_service.cpp" target="_top">../src/examples/cpp03/services/logger_service.cpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/services/logger_service.hpp" target="_top">../src/examples/cpp03/services/logger_service.hpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/services/stream_socket_service.hpp" target="_top">../src/examples/cpp03/services/stream_socket_service.hpp</a>
</li>
</ul></div>
<h5>
<a name="asio.examples.cpp03_examples.h16"></a>
<span><a name="asio.examples.cpp03_examples.socks_4"></a></span><a class="link" href="cpp03_examples.html#asio.examples.cpp03_examples.socks_4">SOCKS
4</a>
</h5>
<p>
Example client program implementing the SOCKS 4 protocol for communication
via a proxy.
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem">
<a href="../../../src/examples/cpp03/socks4/sync_client.cpp" target="_top">../src/examples/cpp03/socks4/sync_client.cpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/socks4/socks4.hpp" target="_top">../src/examples/cpp03/socks4/socks4.hpp</a>
</li>
</ul></div>
<h5>
<a name="asio.examples.cpp03_examples.h17"></a>
<span><a name="asio.examples.cpp03_examples.ssl"></a></span><a class="link" href="cpp03_examples.html#asio.examples.cpp03_examples.ssl">SSL</a>
</h5>
<p>
Example client and server programs showing the use of the <a class="link" href="../reference/ssl__stream.html" title="ssl::stream">ssl::stream&lt;&gt;</a>
template with asynchronous operations.
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem">
<a href="../../../src/examples/cpp03/ssl/client.cpp" target="_top">../src/examples/cpp03/ssl/client.cpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/ssl/server.cpp" target="_top">../src/examples/cpp03/ssl/server.cpp</a>
</li>
</ul></div>
<h5>
<a name="asio.examples.cpp03_examples.h18"></a>
<span><a name="asio.examples.cpp03_examples.timeouts"></a></span><a class="link" href="cpp03_examples.html#asio.examples.cpp03_examples.timeouts">Timeouts</a>
</h5>
<p>
A collection of examples showing how to cancel long running asynchronous
operations after a period of time.
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem">
<a href="../../../src/examples/cpp03/timeouts/async_tcp_client.cpp" target="_top">../src/examples/cpp03/timeouts/async_tcp_client.cpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/timeouts/blocking_tcp_client.cpp" target="_top">../src/examples/cpp03/timeouts/blocking_tcp_client.cpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/timeouts/blocking_token_tcp_client.cpp" target="_top">../src/examples/cpp03/timeouts/blocking_token_tcp_client.cpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/timeouts/blocking_udp_client.cpp" target="_top">../src/examples/cpp03/timeouts/blocking_udp_client.cpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/timeouts/server.cpp" target="_top">../src/examples/cpp03/timeouts/server.cpp</a>
</li>
</ul></div>
<h5>
<a name="asio.examples.cpp03_examples.h19"></a>
<span><a name="asio.examples.cpp03_examples.timers"></a></span><a class="link" href="cpp03_examples.html#asio.examples.cpp03_examples.timers">Timers</a>
</h5>
<p>
Example showing how to customise basic_waitable_timer using a different clock
type.
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
<a href="../../../src/examples/cpp03/timers/time_t_timer.cpp" target="_top">../src/examples/cpp03/timers/time_t_timer.cpp</a>
</li></ul></div>
<h5>
<a name="asio.examples.cpp03_examples.h20"></a>
<span><a name="asio.examples.cpp03_examples.porthopper"></a></span><a class="link" href="cpp03_examples.html#asio.examples.cpp03_examples.porthopper">Porthopper</a>
</h5>
<p>
Example illustrating mixed synchronous and asynchronous operations, and how
to use Boost.Lambda with Asio.
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem">
<a href="../../../src/examples/cpp03/porthopper/protocol.hpp" target="_top">../src/examples/cpp03/porthopper/protocol.hpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/porthopper/client.cpp" target="_top">../src/examples/cpp03/porthopper/client.cpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/porthopper/server.cpp" target="_top">../src/examples/cpp03/porthopper/server.cpp</a>
</li>
</ul></div>
<h5>
<a name="asio.examples.cpp03_examples.h21"></a>
<span><a name="asio.examples.cpp03_examples.nonblocking"></a></span><a class="link" href="cpp03_examples.html#asio.examples.cpp03_examples.nonblocking">Nonblocking</a>
</h5>
<p>
Example demonstrating reactor-style operations for integrating a third-party
library that wants to perform the I/O operations itself.
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
<a href="../../../src/examples/cpp03/nonblocking/third_party_lib.cpp" target="_top">../src/examples/cpp03/nonblocking/third_party_lib.cpp</a>
</li></ul></div>
<h5>
<a name="asio.examples.cpp03_examples.h22"></a>
<span><a name="asio.examples.cpp03_examples.spawn"></a></span><a class="link" href="cpp03_examples.html#asio.examples.cpp03_examples.spawn">Spawn</a>
</h5>
<p>
Example of using the asio::spawn() function, a wrapper around the <a href="http://www.boost.org/doc/libs/release/libs/coroutine/index.html" target="_top">Boost.Coroutine</a>
library, to implement a chain of asynchronous operations using stackful coroutines.
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
<a href="../../../src/examples/cpp03/spawn/echo_server.cpp" target="_top">../src/examples/cpp03/spawn/echo_server.cpp</a>
</li></ul></div>
<h5>
<a name="asio.examples.cpp03_examples.h23"></a>
<span><a name="asio.examples.cpp03_examples.unix_domain_sockets"></a></span><a class="link" href="cpp03_examples.html#asio.examples.cpp03_examples.unix_domain_sockets">UNIX
Domain Sockets</a>
</h5>
<p>
Examples showing how to use UNIX domain (local) sockets.
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem">
<a href="../../../src/examples/cpp03/local/connect_pair.cpp" target="_top">../src/examples/cpp03/local/connect_pair.cpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/local/iostream_client.cpp" target="_top">../src/examples/cpp03/local/iostream_client.cpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/local/stream_server.cpp" target="_top">../src/examples/cpp03/local/stream_server.cpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp03/local/stream_client.cpp" target="_top">../src/examples/cpp03/local/stream_client.cpp</a>
</li>
</ul></div>
<h5>
<a name="asio.examples.cpp03_examples.h24"></a>
<span><a name="asio.examples.cpp03_examples.windows"></a></span><a class="link" href="cpp03_examples.html#asio.examples.cpp03_examples.windows">Windows</a>
</h5>
<p>
An example showing how to use the Windows-specific function <code class="computeroutput">TransmitFile</code>
with Asio.
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
<a href="../../../src/examples/cpp03/windows/transmit_file.cpp" target="_top">../src/examples/cpp03/windows/transmit_file.cpp</a>
</li></ul></div>
</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-2020 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="../examples.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../examples.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="cpp11_examples.html"><img src="../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,451 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>C++11 Examples</title>
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../index.html" title="Asio">
<link rel="up" href="../examples.html" title="Examples">
<link rel="prev" href="cpp03_examples.html" title="C++03 Examples">
<link rel="next" href="cpp14_examples.html" title="C++14 Examples">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="cpp03_examples.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../examples.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="cpp14_examples.html"><img src="../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="asio.examples.cpp11_examples"></a><a class="link" href="cpp11_examples.html" title="C++11 Examples">C++11 Examples</a>
</h3></div></div></div>
<h5>
<a name="asio.examples.cpp11_examples.h0"></a>
<span><a name="asio.examples.cpp11_examples.allocation"></a></span><a class="link" href="cpp11_examples.html#asio.examples.cpp11_examples.allocation">Allocation</a>
</h5>
<p>
This example shows how to customise the allocation of memory associated with
asynchronous operations.
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
<a href="../../../src/examples/cpp11/allocation/server.cpp" target="_top">../src/examples/cpp11/allocation/server.cpp</a>
(<a href="../../examples/diffs/allocation/server.cpp.html" target="_top">diff to C++03</a>)
</li></ul></div>
<h5>
<a name="asio.examples.cpp11_examples.h1"></a>
<span><a name="asio.examples.cpp11_examples.buffers"></a></span><a class="link" href="cpp11_examples.html#asio.examples.cpp11_examples.buffers">Buffers</a>
</h5>
<p>
This example demonstrates how to create reference counted buffers that can
be used with socket read and write operations.
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
<a href="../../../src/examples/cpp11/buffers/reference_counted.cpp" target="_top">../src/examples/cpp11/buffers/reference_counted.cpp</a>
(<a href="../../examples/diffs/buffers/reference_counted.cpp.html" target="_top">diff
to C++03</a>)
</li></ul></div>
<h5>
<a name="asio.examples.cpp11_examples.h2"></a>
<span><a name="asio.examples.cpp11_examples.chat"></a></span><a class="link" href="cpp11_examples.html#asio.examples.cpp11_examples.chat">Chat</a>
</h5>
<p>
This example implements a chat server and client. The programs use a custom
protocol with a fixed length message header and variable length message body.
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem">
<a href="../../../src/examples/cpp11/chat/chat_message.hpp" target="_top">../src/examples/cpp11/chat/chat_message.hpp</a>
(<a href="../../examples/diffs/chat/chat_message.hpp.html" target="_top">diff to C++03</a>)
</li>
<li class="listitem">
<a href="../../../src/examples/cpp11/chat/chat_client.cpp" target="_top">../src/examples/cpp11/chat/chat_client.cpp</a>
(<a href="../../examples/diffs/chat/chat_client.cpp.html" target="_top">diff to C++03</a>)
</li>
<li class="listitem">
<a href="../../../src/examples/cpp11/chat/chat_server.cpp" target="_top">../src/examples/cpp11/chat/chat_server.cpp</a>
(<a href="../../examples/diffs/chat/chat_server.cpp.html" target="_top">diff to C++03</a>)
</li>
</ul></div>
<h5>
<a name="asio.examples.cpp11_examples.h3"></a>
<span><a name="asio.examples.cpp11_examples.echo"></a></span><a class="link" href="cpp11_examples.html#asio.examples.cpp11_examples.echo">Echo</a>
</h5>
<p>
A collection of simple clients and servers, showing the use of both synchronous
and asynchronous operations.
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem">
<a href="../../../src/examples/cpp11/echo/async_tcp_echo_server.cpp" target="_top">../src/examples/cpp11/echo/async_tcp_echo_server.cpp</a>
(<a href="../../examples/diffs/echo/async_tcp_echo_server.cpp.html" target="_top">diff
to C++03</a>)
</li>
<li class="listitem">
<a href="../../../src/examples/cpp11/echo/async_udp_echo_server.cpp" target="_top">../src/examples/cpp11/echo/async_udp_echo_server.cpp</a>
(<a href="../../examples/diffs/echo/async_udp_echo_server.cpp.html" target="_top">diff
to C++03</a>)
</li>
<li class="listitem">
<a href="../../../src/examples/cpp11/echo/blocking_tcp_echo_client.cpp" target="_top">../src/examples/cpp11/echo/blocking_tcp_echo_client.cpp</a>
(<a href="../../examples/diffs/echo/blocking_tcp_echo_client.cpp.html" target="_top">diff
to C++03</a>)
</li>
<li class="listitem">
<a href="../../../src/examples/cpp11/echo/blocking_tcp_echo_server.cpp" target="_top">../src/examples/cpp11/echo/blocking_tcp_echo_server.cpp</a>
(<a href="../../examples/diffs/echo/blocking_tcp_echo_server.cpp.html" target="_top">diff
to C++03</a>)
</li>
<li class="listitem">
<a href="../../../src/examples/cpp11/echo/blocking_udp_echo_client.cpp" target="_top">../src/examples/cpp11/echo/blocking_udp_echo_client.cpp</a>
(<a href="../../examples/diffs/echo/blocking_udp_echo_client.cpp.html" target="_top">diff
to C++03</a>)
</li>
<li class="listitem">
<a href="../../../src/examples/cpp11/echo/blocking_udp_echo_server.cpp" target="_top">../src/examples/cpp11/echo/blocking_udp_echo_server.cpp</a>
(<a href="../../examples/diffs/echo/blocking_udp_echo_server.cpp.html" target="_top">diff
to C++03</a>)
</li>
</ul></div>
<h5>
<a name="asio.examples.cpp11_examples.h4"></a>
<span><a name="asio.examples.cpp11_examples.fork"></a></span><a class="link" href="cpp11_examples.html#asio.examples.cpp11_examples.fork">Fork</a>
</h5>
<p>
These POSIX-specific examples show how to use Asio in conjunction with the
<code class="computeroutput">fork()</code> system call. The first example illustrates the steps
required to start a daemon process:
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
<a href="../../../src/examples/cpp11/fork/daemon.cpp" target="_top">../src/examples/cpp11/fork/daemon.cpp</a>
(<a href="../../examples/diffs/fork/daemon.cpp.html" target="_top">diff to C++03</a>)
</li></ul></div>
<p>
The second example demonstrates how it is possible to fork a process from
within a completion handler.
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
<a href="../../../src/examples/cpp11/fork/process_per_connection.cpp" target="_top">../src/examples/cpp11/fork/process_per_connection.cpp</a>
(<a href="../../examples/diffs/fork/process_per_connection.cpp.html" target="_top">diff
to C++03</a>)
</li></ul></div>
<h5>
<a name="asio.examples.cpp11_examples.h5"></a>
<span><a name="asio.examples.cpp11_examples.futures"></a></span><a class="link" href="cpp11_examples.html#asio.examples.cpp11_examples.futures">Futures</a>
</h5>
<p>
This example demonstrates how to use std::future in conjunction with Asio's
asynchronous operations.
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
<a href="../../../src/examples/cpp11/futures/daytime_client.cpp" target="_top">../src/examples/cpp11/futures/daytime_client.cpp</a>
</li></ul></div>
<h5>
<a name="asio.examples.cpp11_examples.h6"></a>
<span><a name="asio.examples.cpp11_examples.handler_tracking"></a></span><a class="link" href="cpp11_examples.html#asio.examples.cpp11_examples.handler_tracking">Handler
Tracking</a>
</h5>
<p>
This example header file shows how to implement custom handler tracking.
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
<a href="../../../src/examples/cpp11/handler_tracking/custom_tracking.hpp" target="_top">../src/examples/cpp11/handler_tracking/custom_tracking.hpp</a>
</li></ul></div>
<p>
This example program shows how to include source location information in
the handler tracking output.
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
<a href="../../../src/examples/cpp11/handler_tracking/async_tcp_echo_server.cpp" target="_top">../src/examples/cpp11/handler_tracking/async_tcp_echo_server.cpp</a>
</li></ul></div>
<h5>
<a name="asio.examples.cpp11_examples.h7"></a>
<span><a name="asio.examples.cpp11_examples.http_server"></a></span><a class="link" href="cpp11_examples.html#asio.examples.cpp11_examples.http_server">HTTP
Server</a>
</h5>
<p>
This example illustrates the use of asio in a simple single-threaded server
implementation of HTTP 1.0. It demonstrates how to perform a clean shutdown
by cancelling all outstanding asynchronous operations.
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem">
<a href="../../../src/examples/cpp11/http/server/connection.cpp" target="_top">../src/examples/cpp11/http/server/connection.cpp</a>
(<a href="../../examples/diffs/http/server/connection.cpp.html" target="_top">diff to
C++03</a>)
</li>
<li class="listitem">
<a href="../../../src/examples/cpp11/http/server/connection.hpp" target="_top">../src/examples/cpp11/http/server/connection.hpp</a>
(<a href="../../examples/diffs/http/server/connection.hpp.html" target="_top">diff to
C++03</a>)
</li>
<li class="listitem">
<a href="../../../src/examples/cpp11/http/server/connection_manager.cpp" target="_top">../src/examples/cpp11/http/server/connection_manager.cpp</a>
(<a href="../../examples/diffs/http/server/connection_manager.cpp.html" target="_top">diff
to C++03</a>)
</li>
<li class="listitem">
<a href="../../../src/examples/cpp11/http/server/connection_manager.hpp" target="_top">../src/examples/cpp11/http/server/connection_manager.hpp</a>
(<a href="../../examples/diffs/http/server/connection_manager.hpp.html" target="_top">diff
to C++03</a>)
</li>
<li class="listitem">
<a href="../../../src/examples/cpp11/http/server/header.hpp" target="_top">../src/examples/cpp11/http/server/header.hpp</a>
(<a href="../../examples/diffs/http/server/header.hpp.html" target="_top">diff to C++03</a>)
</li>
<li class="listitem">
<a href="../../../src/examples/cpp11/http/server/main.cpp" target="_top">../src/examples/cpp11/http/server/main.cpp</a>
(<a href="../../examples/diffs/http/server/main.cpp.html" target="_top">diff to C++03</a>)
</li>
<li class="listitem">
<a href="../../../src/examples/cpp11/http/server/mime_types.cpp" target="_top">../src/examples/cpp11/http/server/mime_types.cpp</a>
(<a href="../../examples/diffs/http/server/mime_types.cpp.html" target="_top">diff to
C++03</a>)
</li>
<li class="listitem">
<a href="../../../src/examples/cpp11/http/server/mime_types.hpp" target="_top">../src/examples/cpp11/http/server/mime_types.hpp</a>
(<a href="../../examples/diffs/http/server/mime_types.hpp.html" target="_top">diff to
C++03</a>)
</li>
<li class="listitem">
<a href="../../../src/examples/cpp11/http/server/reply.cpp" target="_top">../src/examples/cpp11/http/server/reply.cpp</a>
(<a href="../../examples/diffs/http/server/reply.cpp.html" target="_top">diff to C++03</a>)
</li>
<li class="listitem">
<a href="../../../src/examples/cpp11/http/server/reply.hpp" target="_top">../src/examples/cpp11/http/server/reply.hpp</a>
(<a href="../../examples/diffs/http/server/reply.hpp.html" target="_top">diff to C++03</a>)
</li>
<li class="listitem">
<a href="../../../src/examples/cpp11/http/server/request.hpp" target="_top">../src/examples/cpp11/http/server/request.hpp</a>
(<a href="../../examples/diffs/http/server/request.hpp.html" target="_top">diff to C++03</a>)
</li>
<li class="listitem">
<a href="../../../src/examples/cpp11/http/server/request_handler.cpp" target="_top">../src/examples/cpp11/http/server/request_handler.cpp</a>
(<a href="../../examples/diffs/http/server/request_handler.cpp.html" target="_top">diff
to C++03</a>)
</li>
<li class="listitem">
<a href="../../../src/examples/cpp11/http/server/request_handler.hpp" target="_top">../src/examples/cpp11/http/server/request_handler.hpp</a>
(<a href="../../examples/diffs/http/server/request_handler.hpp.html" target="_top">diff
to C++03</a>)
</li>
<li class="listitem">
<a href="../../../src/examples/cpp11/http/server/request_parser.cpp" target="_top">../src/examples/cpp11/http/server/request_parser.cpp</a>
(<a href="../../examples/diffs/http/server/request_parser.cpp.html" target="_top">diff
to C++03</a>)
</li>
<li class="listitem">
<a href="../../../src/examples/cpp11/http/server/request_parser.hpp" target="_top">../src/examples/cpp11/http/server/request_parser.hpp</a>
(<a href="../../examples/diffs/http/server/request_parser.hpp.html" target="_top">diff
to C++03</a>)
</li>
<li class="listitem">
<a href="../../../src/examples/cpp11/http/server/server.cpp" target="_top">../src/examples/cpp11/http/server/server.cpp</a>
(<a href="../../examples/diffs/http/server/server.cpp.html" target="_top">diff to C++03</a>)
</li>
<li class="listitem">
<a href="../../../src/examples/cpp11/http/server/server.hpp" target="_top">../src/examples/cpp11/http/server/server.hpp</a>
(<a href="../../examples/diffs/http/server/server.hpp.html" target="_top">diff to C++03</a>)
</li>
</ul></div>
<h5>
<a name="asio.examples.cpp11_examples.h8"></a>
<span><a name="asio.examples.cpp11_examples.multicast"></a></span><a class="link" href="cpp11_examples.html#asio.examples.cpp11_examples.multicast">Multicast</a>
</h5>
<p>
An example showing the use of multicast to transmit packets to a group of
subscribers.
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem">
<a href="../../../src/examples/cpp11/multicast/receiver.cpp" target="_top">../src/examples/cpp11/multicast/receiver.cpp</a>
(<a href="../../examples/diffs/multicast/receiver.cpp.html" target="_top">diff to C++03</a>)
</li>
<li class="listitem">
<a href="../../../src/examples/cpp11/multicast/sender.cpp" target="_top">../src/examples/cpp11/multicast/sender.cpp</a>
(<a href="../../examples/diffs/multicast/sender.cpp.html" target="_top">diff to C++03</a>)
</li>
</ul></div>
<h5>
<a name="asio.examples.cpp11_examples.h9"></a>
<span><a name="asio.examples.cpp11_examples.nonblocking"></a></span><a class="link" href="cpp11_examples.html#asio.examples.cpp11_examples.nonblocking">Nonblocking</a>
</h5>
<p>
Example demonstrating reactor-style operations for integrating a third-party
library that wants to perform the I/O operations itself.
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
<a href="../../../src/examples/cpp11/nonblocking/third_party_lib.cpp" target="_top">../src/examples/cpp11/nonblocking/third_party_lib.cpp</a>
(<a href="../../examples/diffs/nonblocking/third_party_lib.cpp.html" target="_top">diff
to C++03</a>)
</li></ul></div>
<h5>
<a name="asio.examples.cpp11_examples.h10"></a>
<span><a name="asio.examples.cpp11_examples.operations"></a></span><a class="link" href="cpp11_examples.html#asio.examples.cpp11_examples.operations">Operations</a>
</h5>
<p>
Examples showing how to implement composed asynchronous operations as reusable
library functions.
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem">
<a href="../../../src/examples/cpp11/operations/composed_1.cpp" target="_top">../src/examples/cpp11/operations/composed_1.cpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp11/operations/composed_2.cpp" target="_top">../src/examples/cpp11/operations/composed_2.cpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp11/operations/composed_3.cpp" target="_top">../src/examples/cpp11/operations/composed_3.cpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp11/operations/composed_4.cpp" target="_top">../src/examples/cpp11/operations/composed_4.cpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp11/operations/composed_5.cpp" target="_top">../src/examples/cpp11/operations/composed_5.cpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp11/operations/composed_6.cpp" target="_top">../src/examples/cpp11/operations/composed_6.cpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp11/operations/composed_7.cpp" target="_top">../src/examples/cpp11/operations/composed_7.cpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp11/operations/composed_8.cpp" target="_top">../src/examples/cpp11/operations/composed_8.cpp</a>
</li>
</ul></div>
<h5>
<a name="asio.examples.cpp11_examples.h11"></a>
<span><a name="asio.examples.cpp11_examples.socks_4"></a></span><a class="link" href="cpp11_examples.html#asio.examples.cpp11_examples.socks_4">SOCKS
4</a>
</h5>
<p>
Example client program implementing the SOCKS 4 protocol for communication
via a proxy.
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem">
<a href="../../../src/examples/cpp11/socks4/sync_client.cpp" target="_top">../src/examples/cpp11/socks4/sync_client.cpp</a>
(<a href="../../examples/diffs/socks4/sync_client.cpp.html" target="_top">diff to C++03</a>)
</li>
<li class="listitem">
<a href="../../../src/examples/cpp11/socks4/socks4.hpp" target="_top">../src/examples/cpp11/socks4/socks4.hpp</a>
(<a href="../../examples/diffs/socks4/socks4.hpp.html" target="_top">diff to C++03</a>)
</li>
</ul></div>
<h5>
<a name="asio.examples.cpp11_examples.h12"></a>
<span><a name="asio.examples.cpp11_examples.spawn"></a></span><a class="link" href="cpp11_examples.html#asio.examples.cpp11_examples.spawn">Spawn</a>
</h5>
<p>
Example of using the asio::spawn() function, a wrapper around the <a href="http://www.boost.org/doc/libs/release/libs/coroutine/index.html" target="_top">Boost.Coroutine</a>
library, to implement a chain of asynchronous operations using stackful coroutines.
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
<a href="../../../src/examples/cpp11/spawn/echo_server.cpp" target="_top">../src/examples/cpp11/spawn/echo_server.cpp</a>
(<a href="../../examples/diffs/spawn/echo_server.cpp.html" target="_top">diff to C++03</a>)
</li></ul></div>
<h5>
<a name="asio.examples.cpp11_examples.h13"></a>
<span><a name="asio.examples.cpp11_examples.ssl"></a></span><a class="link" href="cpp11_examples.html#asio.examples.cpp11_examples.ssl">SSL</a>
</h5>
<p>
Example client and server programs showing the use of the <a class="link" href="../reference/ssl__stream.html" title="ssl::stream">ssl::stream&lt;&gt;</a>
template with asynchronous operations.
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem">
<a href="../../../src/examples/cpp11/ssl/client.cpp" target="_top">../src/examples/cpp11/ssl/client.cpp</a>
(<a href="../../examples/diffs/ssl/client.cpp.html" target="_top">diff to C++03</a>)
</li>
<li class="listitem">
<a href="../../../src/examples/cpp11/ssl/server.cpp" target="_top">../src/examples/cpp11/ssl/server.cpp</a>
(<a href="../../examples/diffs/ssl/server.cpp.html" target="_top">diff to C++03</a>)
</li>
</ul></div>
<h5>
<a name="asio.examples.cpp11_examples.h14"></a>
<span><a name="asio.examples.cpp11_examples.timeouts"></a></span><a class="link" href="cpp11_examples.html#asio.examples.cpp11_examples.timeouts">Timeouts</a>
</h5>
<p>
A collection of examples showing how to cancel long running asynchronous
operations after a period of time.
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem">
<a href="../../../src/examples/cpp11/timeouts/async_tcp_client.cpp" target="_top">../src/examples/cpp11/timeouts/async_tcp_client.cpp</a>
(<a href="../../examples/diffs/timeouts/async_tcp_client.cpp.html" target="_top">diff
to C++03</a>)
</li>
<li class="listitem">
<a href="../../../src/examples/cpp11/timeouts/blocking_tcp_client.cpp" target="_top">../src/examples/cpp11/timeouts/blocking_tcp_client.cpp</a>
(<a href="../../examples/diffs/timeouts/blocking_tcp_client.cpp.html" target="_top">diff
to C++03</a>)
</li>
<li class="listitem">
<a href="../../../src/examples/cpp11/timeouts/blocking_token_tcp_client.cpp" target="_top">../src/examples/cpp11/timeouts/blocking_token_tcp_client.cpp</a>
(<a href="../../examples/diffs/timeouts/blocking_token_tcp_client.cpp.html" target="_top">diff
to C++03</a>)
</li>
<li class="listitem">
<a href="../../../src/examples/cpp11/timeouts/blocking_udp_client.cpp" target="_top">../src/examples/cpp11/timeouts/blocking_udp_client.cpp</a>
(<a href="../../examples/diffs/timeouts/blocking_udp_client.cpp.html" target="_top">diff
to C++03</a>)
</li>
<li class="listitem">
<a href="../../../src/examples/cpp11/timeouts/server.cpp" target="_top">../src/examples/cpp11/timeouts/server.cpp</a>
(<a href="../../examples/diffs/timeouts/server.cpp.html" target="_top">diff to C++03</a>)
</li>
</ul></div>
<h5>
<a name="asio.examples.cpp11_examples.h15"></a>
<span><a name="asio.examples.cpp11_examples.timers"></a></span><a class="link" href="cpp11_examples.html#asio.examples.cpp11_examples.timers">Timers</a>
</h5>
<p>
Example showing how to customise basic_waitable_timer using a different clock
type.
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
<a href="../../../src/examples/cpp11/timers/time_t_timer.cpp" target="_top">../src/examples/cpp11/timers/time_t_timer.cpp</a>
(<a href="../../examples/diffs/timers/time_t_timer.cpp.html" target="_top">diff to C++03</a>)
</li></ul></div>
<h5>
<a name="asio.examples.cpp11_examples.h16"></a>
<span><a name="asio.examples.cpp11_examples.unix_domain_sockets"></a></span><a class="link" href="cpp11_examples.html#asio.examples.cpp11_examples.unix_domain_sockets">UNIX
Domain Sockets</a>
</h5>
<p>
Examples showing how to use UNIX domain (local) sockets.
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem">
<a href="../../../src/examples/cpp11/local/connect_pair.cpp" target="_top">../src/examples/cpp11/local/connect_pair.cpp</a>
(<a href="../../examples/diffs/local/connect_pair.cpp.html" target="_top">diff to C++03</a>)
</li>
<li class="listitem">
<a href="../../../src/examples/cpp11/local/iostream_client.cpp" target="_top">../src/examples/cpp11/local/iostream_client.cpp</a>
(<a href="../../examples/diffs/local/iostream_client.cpp.html" target="_top">diff to C++03</a>)
</li>
<li class="listitem">
<a href="../../../src/examples/cpp11/local/stream_server.cpp" target="_top">../src/examples/cpp11/local/stream_server.cpp</a>
(<a href="../../examples/diffs/local/stream_server.cpp.html" target="_top">diff to C++03</a>)
</li>
<li class="listitem">
<a href="../../../src/examples/cpp11/local/stream_client.cpp" target="_top">../src/examples/cpp11/local/stream_client.cpp</a>
(<a href="../../examples/diffs/local/stream_client.cpp.html" target="_top">diff to C++03</a>)
</li>
</ul></div>
</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-2020 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="cpp03_examples.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../examples.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="cpp14_examples.html"><img src="../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,71 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>C++14 Examples</title>
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../index.html" title="Asio">
<link rel="up" href="../examples.html" title="Examples">
<link rel="prev" href="cpp11_examples.html" title="C++11 Examples">
<link rel="next" href="cpp17_examples.html" title="C++17 Examples">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="cpp11_examples.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../examples.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="cpp17_examples.html"><img src="../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="asio.examples.cpp14_examples"></a><a class="link" href="cpp14_examples.html" title="C++14 Examples">C++14 Examples</a>
</h3></div></div></div>
<h5>
<a name="asio.examples.cpp14_examples.h0"></a>
<span><a name="asio.examples.cpp14_examples.operations"></a></span><a class="link" href="cpp14_examples.html#asio.examples.cpp14_examples.operations">Operations</a>
</h5>
<p>
Examples showing how to implement composed asynchronous operations as reusable
library functions.
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem">
<a href="../../../src/examples/cpp14/operations/composed_1.cpp" target="_top">../src/examples/cpp14/operations/composed_1.cpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp14/operations/composed_2.cpp" target="_top">../src/examples/cpp14/operations/composed_2.cpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp14/operations/composed_3.cpp" target="_top">../src/examples/cpp14/operations/composed_3.cpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp14/operations/composed_4.cpp" target="_top">../src/examples/cpp14/operations/composed_4.cpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp14/operations/composed_5.cpp" target="_top">../src/examples/cpp14/operations/composed_5.cpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp14/operations/composed_6.cpp" target="_top">../src/examples/cpp14/operations/composed_6.cpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp14/operations/composed_7.cpp" target="_top">../src/examples/cpp14/operations/composed_7.cpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp14/operations/composed_8.cpp" target="_top">../src/examples/cpp14/operations/composed_8.cpp</a>
</li>
</ul></div>
</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-2020 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="cpp11_examples.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../examples.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="cpp17_examples.html"><img src="../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,63 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>C++17 Examples</title>
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../index.html" title="Asio">
<link rel="up" href="../examples.html" title="Examples">
<link rel="prev" href="cpp14_examples.html" title="C++14 Examples">
<link rel="next" href="../reference.html" title="Reference">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="cpp14_examples.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../examples.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="../reference.html"><img src="../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="asio.examples.cpp17_examples"></a><a class="link" href="cpp17_examples.html" title="C++17 Examples">C++17 Examples</a>
</h3></div></div></div>
<h5>
<a name="asio.examples.cpp17_examples.h0"></a>
<span><a name="asio.examples.cpp17_examples.coroutines_ts_support"></a></span><a class="link" href="cpp17_examples.html#asio.examples.cpp17_examples.coroutines_ts_support">Coroutines
TS Support</a>
</h5>
<p>
Examples showing how to implement a chain of asynchronous operations using
the Coroutines TS.
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem">
<a href="../../../src/examples/cpp17/coroutines_ts/echo_server.cpp" target="_top">../src/examples/cpp17/coroutines_ts/echo_server.cpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp17/coroutines_ts/refactored_echo_server.cpp" target="_top">../src/examples/cpp17/coroutines_ts/refactored_echo_server.cpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp17/coroutines_ts/double_buffered_echo_server.cpp" target="_top">../src/examples/cpp17/coroutines_ts/double_buffered_echo_server.cpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp17/coroutines_ts/chat_server.cpp" target="_top">../src/examples/cpp17/coroutines_ts/chat_server.cpp</a>
</li>
<li class="listitem">
<a href="../../../src/examples/cpp17/coroutines_ts/range_based_for.cpp" target="_top">../src/examples/cpp17/coroutines_ts/range_based_for.cpp</a>
</li>
</ul></div>
</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-2020 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="cpp14_examples.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../examples.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="../reference.html"><img src="../../next.png" alt="Next"></a>
</div>
</body>
</html>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,155 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Overview</title>
<link rel="stylesheet" href="../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../index.html" title="Asio">
<link rel="up" href="../index.html" title="Asio">
<link rel="prev" href="../index.html" title="Asio">
<link rel="next" href="overview/rationale.html" title="Rationale">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="../index.html"><img src="../prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../home.png" alt="Home"></a><a accesskey="n" href="overview/rationale.html"><img src="../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
<a name="asio.overview"></a><a class="link" href="overview.html" title="Overview">Overview</a>
</h2></div></div></div>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem">
<a class="link" href="overview/rationale.html" title="Rationale">Rationale</a>
</li>
<li class="listitem">
<a class="link" href="overview/core.html" title="Core Concepts and Functionality">Core Concepts and Functionality</a>
<div class="itemizedlist"><ul class="itemizedlist" type="circle">
<li class="listitem">
<a class="link" href="overview/core/basics.html" title="Basic Asio Anatomy">Basic Asio Anatomy</a>
</li>
<li class="listitem">
<a class="link" href="overview/core/async.html" title="The Proactor Design Pattern: Concurrency Without Threads">The Proactor Design Pattern:
Concurrency Without Threads</a>
</li>
<li class="listitem">
<a class="link" href="overview/core/threads.html" title="Threads and Asio">Threads and Asio</a>
</li>
<li class="listitem">
<a class="link" href="overview/core/strands.html" title="Strands: Use Threads Without Explicit Locking">Strands: Use Threads Without
Explicit Locking</a>
</li>
<li class="listitem">
<a class="link" href="overview/core/buffers.html" title="Buffers">Buffers</a>
</li>
<li class="listitem">
<a class="link" href="overview/core/streams.html" title="Streams, Short Reads and Short Writes">Streams, Short Reads and
Short Writes</a>
</li>
<li class="listitem">
<a class="link" href="overview/core/reactor.html" title="Reactor-Style Operations">Reactor-Style Operations</a>
</li>
<li class="listitem">
<a class="link" href="overview/core/line_based.html" title="Line-Based Operations">Line-Based Operations</a>
</li>
<li class="listitem">
<a class="link" href="overview/core/allocation.html" title="Custom Memory Allocation">Custom Memory Allocation</a>
</li>
<li class="listitem">
<a class="link" href="overview/core/handler_tracking.html" title="Handler Tracking">Handler Tracking</a>
</li>
<li class="listitem">
<a class="link" href="overview/core/concurrency_hint.html" title="Concurrency Hints">Concurrency Hints</a>
</li>
<li class="listitem">
<a class="link" href="overview/core/coroutine.html" title="Stackless Coroutines">Stackless Coroutines</a>
</li>
<li class="listitem">
<a class="link" href="overview/core/spawn.html" title="Stackful Coroutines">Stackful Coroutines</a>
</li>
<li class="listitem">
<a class="link" href="overview/core/coroutines_ts.html" title="Coroutines TS Support">Coroutines TS Support</a>
</li>
</ul></div>
</li>
<li class="listitem">
<a class="link" href="overview/networking.html" title="Networking">Networking</a>
<div class="itemizedlist"><ul class="itemizedlist" type="circle">
<li class="listitem">
<a class="link" href="overview/networking/protocols.html" title="TCP, UDP and ICMP">TCP, UDP and ICMP</a>
</li>
<li class="listitem">
<a class="link" href="overview/networking/other_protocols.html" title="Support for Other Protocols">Support
for Other Protocols</a>
</li>
<li class="listitem">
<a class="link" href="overview/networking/iostreams.html" title="Socket Iostreams">Socket Iostreams</a>
</li>
<li class="listitem">
<a class="link" href="overview/networking/bsd_sockets.html" title="The BSD Socket API and Asio">The BSD Socket
API and Asio</a>
</li>
</ul></div>
</li>
<li class="listitem">
<a class="link" href="overview/timers.html" title="Timers">Timers</a>
</li>
<li class="listitem">
<a class="link" href="overview/serial_ports.html" title="Serial Ports">Serial Ports</a>
</li>
<li class="listitem">
<a class="link" href="overview/signals.html" title="Signal Handling">Signal Handling</a>
</li>
<li class="listitem">
<a class="link" href="overview/posix.html" title="POSIX-Specific Functionality">POSIX-Specific Functionality</a>
<div class="itemizedlist"><ul class="itemizedlist" type="circle">
<li class="listitem">
<a class="link" href="overview/posix/local.html" title="UNIX Domain Sockets">UNIX Domain Sockets</a>
</li>
<li class="listitem">
<a class="link" href="overview/posix/stream_descriptor.html" title="Stream-Oriented File Descriptors">Stream-Oriented
File Descriptors</a>
</li>
</ul></div>
</li>
<li class="listitem">
<a class="link" href="overview/windows.html" title="Windows-Specific Functionality">Windows-Specific Functionality</a>
<div class="itemizedlist"><ul class="itemizedlist" type="circle">
<li class="listitem">
<a class="link" href="overview/windows/stream_handle.html" title="Stream-Oriented HANDLEs">Stream-Oriented
HANDLEs</a>
</li>
<li class="listitem">
<a class="link" href="overview/windows/random_access_handle.html" title="Random-Access HANDLEs">Random-Access
HANDLEs</a>
</li>
</ul></div>
</li>
<li class="listitem">
<a class="link" href="overview/ssl.html" title="SSL">SSL</a>
</li>
<li class="listitem">
<a class="link" href="overview/cpp2011.html" title="C++ 2011 Support">C++ 2011 Support</a>
</li>
<li class="listitem">
<a class="link" href="overview/implementation.html" title="Platform-Specific Implementation Notes">Platform-Specific Implementation
Notes</a>
</li>
</ul></div>
</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-2020 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="../index.html"><img src="../prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../home.png" alt="Home"></a><a accesskey="n" href="overview/rationale.html"><img src="../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,84 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Core Concepts and Functionality</title>
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../index.html" title="Asio">
<link rel="up" href="../overview.html" title="Overview">
<link rel="prev" href="rationale.html" title="Rationale">
<link rel="next" href="core/basics.html" title="Basic Asio Anatomy">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="rationale.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../overview.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="core/basics.html"><img src="../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="asio.overview.core"></a><a class="link" href="core.html" title="Core Concepts and Functionality">Core Concepts and Functionality</a>
</h3></div></div></div>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem">
<a class="link" href="core/basics.html" title="Basic Asio Anatomy">Basic Asio Anatomy</a>
</li>
<li class="listitem">
<a class="link" href="core/async.html" title="The Proactor Design Pattern: Concurrency Without Threads">The Proactor Design Pattern:
Concurrency Without Threads</a>
</li>
<li class="listitem">
<a class="link" href="core/threads.html" title="Threads and Asio">Threads and Asio</a>
</li>
<li class="listitem">
<a class="link" href="core/strands.html" title="Strands: Use Threads Without Explicit Locking">Strands: Use Threads Without
Explicit Locking</a>
</li>
<li class="listitem">
<a class="link" href="core/buffers.html" title="Buffers">Buffers</a>
</li>
<li class="listitem">
<a class="link" href="core/streams.html" title="Streams, Short Reads and Short Writes">Streams, Short Reads and Short
Writes</a>
</li>
<li class="listitem">
<a class="link" href="core/reactor.html" title="Reactor-Style Operations">Reactor-Style Operations</a>
</li>
<li class="listitem">
<a class="link" href="core/line_based.html" title="Line-Based Operations">Line-Based Operations</a>
</li>
<li class="listitem">
<a class="link" href="core/allocation.html" title="Custom Memory Allocation">Custom Memory Allocation</a>
</li>
<li class="listitem">
<a class="link" href="core/handler_tracking.html" title="Handler Tracking">Handler Tracking</a>
</li>
<li class="listitem">
<a class="link" href="core/concurrency_hint.html" title="Concurrency Hints">Concurrency Hints</a>
</li>
<li class="listitem">
<a class="link" href="core/coroutine.html" title="Stackless Coroutines">Stackless Coroutines</a>
</li>
<li class="listitem">
<a class="link" href="core/spawn.html" title="Stackful Coroutines">Stackful Coroutines</a>
</li>
<li class="listitem">
<a class="link" href="core/coroutines_ts.html" title="Coroutines TS Support">Coroutines TS Support</a>
</li>
</ul></div>
</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-2020 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="rationale.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../overview.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="core/basics.html"><img src="../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,136 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Custom Memory Allocation</title>
<link rel="stylesheet" href="../../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../../index.html" title="Asio">
<link rel="up" href="../core.html" title="Core Concepts and Functionality">
<link rel="prev" href="line_based.html" title="Line-Based Operations">
<link rel="next" href="handler_tracking.html" title="Handler Tracking">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="line_based.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../core.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="handler_tracking.html"><img src="../../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h4 class="title">
<a name="asio.overview.core.allocation"></a><a class="link" href="allocation.html" title="Custom Memory Allocation">Custom Memory Allocation</a>
</h4></div></div></div>
<p>
Many asynchronous operations need to allocate an object to store state
associated with the operation. For example, a Win32 implementation needs
<code class="computeroutput"><span class="identifier">OVERLAPPED</span></code>-derived objects
to pass to Win32 API functions.
</p>
<p>
Furthermore, programs typically contain easily identifiable chains of asynchronous
operations. A half duplex protocol implementation (e.g. an HTTP server)
would have a single chain of operations per client (receives followed by
sends). A full duplex protocol implementation would have two chains executing
in parallel. Programs should be able to leverage this knowledge to reuse
memory for all asynchronous operations in a chain.
</p>
<p>
Given a copy of a user-defined <code class="computeroutput"><span class="identifier">Handler</span></code>
object <code class="computeroutput"><span class="identifier">h</span></code>, if the implementation
needs to allocate memory associated with that handler it will obtain an
allocator using the <code class="computeroutput"><span class="identifier">get_associated_allocator</span></code>
function. For example:
</p>
<pre class="programlisting"><span class="identifier">asio</span><span class="special">::</span><span class="identifier">associated_allocator_t</span><span class="special">&lt;</span><span class="identifier">Handler</span><span class="special">&gt;</span> <span class="identifier">a</span> <span class="special">=</span> <span class="identifier">asio</span><span class="special">::</span><span class="identifier">get_associated_allocator</span><span class="special">(</span><span class="identifier">h</span><span class="special">);</span>
</pre>
<p>
The associated allocator must satisfy the standard Allocator requirements.
</p>
<p>
By default, handlers use the standard allocator (which is implemented in
terms of <code class="computeroutput"><span class="special">::</span><span class="keyword">operator</span>
<span class="keyword">new</span><span class="special">()</span></code>
and <code class="computeroutput"><span class="special">::</span><span class="keyword">operator</span>
<span class="keyword">delete</span><span class="special">()</span></code>).
The allocator may be customised for a particular handler type by specifying
a nested type <code class="computeroutput"><span class="identifier">allocator_type</span></code>
and member function <code class="computeroutput"><span class="identifier">get_allocator</span><span class="special">()</span></code>:
</p>
<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">my_handler</span>
<span class="special">{</span>
<span class="keyword">public</span><span class="special">:</span>
<span class="comment">// Custom implementation of Allocator type requirements.</span>
<span class="keyword">typedef</span> <span class="identifier">my_allocator</span> <span class="identifier">allocator_type</span><span class="special">;</span>
<span class="comment">// Return a custom allocator implementation.</span>
<span class="identifier">allocator_type</span> <span class="identifier">get_allocator</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span>
<span class="special">{</span>
<span class="keyword">return</span> <span class="identifier">my_allocator</span><span class="special">();</span>
<span class="special">}</span>
<span class="keyword">void</span> <span class="keyword">operator</span><span class="special">()()</span> <span class="special">{</span> <span class="special">...</span> <span class="special">}</span>
<span class="special">};</span>
</pre>
<p>
In more complex cases, the <code class="computeroutput"><span class="identifier">associated_allocator</span></code>
template may be partially specialised directly:
</p>
<pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">asio</span> <span class="special">{</span>
<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Allocator</span><span class="special">&gt;</span>
<span class="keyword">struct</span> <span class="identifier">associated_allocator</span><span class="special">&lt;</span><span class="identifier">my_handler</span><span class="special">,</span> <span class="identifier">Allocator</span><span class="special">&gt;</span>
<span class="special">{</span>
<span class="comment">// Custom implementation of Allocator type requirements.</span>
<span class="keyword">typedef</span> <span class="identifier">my_allocator</span> <span class="identifier">type</span><span class="special">;</span>
<span class="comment">// Return a custom allocator implementation.</span>
<span class="keyword">static</span> <span class="identifier">type</span> <span class="identifier">get</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">my_handler</span><span class="special">&amp;,</span>
<span class="keyword">const</span> <span class="identifier">Allocator</span><span class="special">&amp;</span> <span class="identifier">a</span> <span class="special">=</span> <span class="identifier">Allocator</span><span class="special">())</span> <span class="keyword">noexcept</span>
<span class="special">{</span>
<span class="keyword">return</span> <span class="identifier">my_allocator</span><span class="special">();</span>
<span class="special">}</span>
<span class="special">};</span>
<span class="special">}</span> <span class="comment">// namespace asio</span>
</pre>
<p>
The implementation guarantees that the deallocation will occur before the
associated handler is invoked, which means the memory is ready to be reused
for any new asynchronous operations started by the handler.
</p>
<p>
The custom memory allocation functions may be called from any user-created
thread that is calling a library function. The implementation guarantees
that, for the asynchronous operations included the library, the implementation
will not make concurrent calls to the memory allocation functions for that
handler. The implementation will insert appropriate memory barriers to
ensure correct memory visibility should allocation functions need to be
called from different threads.
</p>
<h6>
<a name="asio.overview.core.allocation.h0"></a>
<span><a name="asio.overview.core.allocation.see_also"></a></span><a class="link" href="allocation.html#asio.overview.core.allocation.see_also">See
Also</a>
</h6>
<p>
<a class="link" href="../../reference/associated_allocator.html" title="associated_allocator">associated_allocator</a>,
<a class="link" href="../../reference/get_associated_allocator.html" title="get_associated_allocator">get_associated_allocator</a>,
<a class="link" href="../../examples/cpp03_examples.html#asio.examples.cpp03_examples.allocation">custom memory allocation
example (C++03)</a>, <a class="link" href="../../examples/cpp11_examples.html#asio.examples.cpp11_examples.allocation">custom
memory allocation example (C++11)</a>.
</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-2020 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="line_based.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../core.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="handler_tracking.html"><img src="../../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,280 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>The Proactor Design Pattern: Concurrency Without Threads</title>
<link rel="stylesheet" href="../../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../../index.html" title="Asio">
<link rel="up" href="../core.html" title="Core Concepts and Functionality">
<link rel="prev" href="basics.html" title="Basic Asio Anatomy">
<link rel="next" href="threads.html" title="Threads and Asio">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="basics.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../core.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="threads.html"><img src="../../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h4 class="title">
<a name="asio.overview.core.async"></a><a class="link" href="async.html" title="The Proactor Design Pattern: Concurrency Without Threads">The Proactor Design Pattern:
Concurrency Without Threads</a>
</h4></div></div></div>
<p>
The Asio library offers side-by-side support for synchronous and asynchronous
operations. The asynchronous support is based on the Proactor design pattern
<a class="link" href="async.html#asio.overview.core.async.references">[POSA2]</a>. The
advantages and disadvantages of this approach, when compared to a synchronous-only
or Reactor approach, are outlined below.
</p>
<h6>
<a name="asio.overview.core.async.h0"></a>
<span><a name="asio.overview.core.async.proactor_and_asio"></a></span><a class="link" href="async.html#asio.overview.core.async.proactor_and_asio">Proactor
and Asio</a>
</h6>
<p>
Let us examine how the Proactor design pattern is implemented in Asio,
without reference to platform-specific details.
</p>
<p>
<span class="inlinemediaobject"><img src="../../../proactor.png" alt="proactor"></span>
</p>
<p>
<span class="bold"><strong>Proactor design pattern (adapted from [POSA2])</strong></span>
</p>
<p>
— Asynchronous Operation
</p>
<div class="blockquote"><blockquote class="blockquote"><p>
Defines an operation that is executed asynchronously, such as an asynchronous
read or write on a socket.
</p></blockquote></div>
<p>
— Asynchronous Operation Processor
</p>
<div class="blockquote"><blockquote class="blockquote"><p>
Executes asynchronous operations and queues events on a completion event
queue when operations complete. From a high-level point of view, internal
services like <code class="computeroutput"><span class="identifier">reactive_socket_service</span></code>
are asynchronous operation processors.
</p></blockquote></div>
<p>
— Completion Event Queue
</p>
<div class="blockquote"><blockquote class="blockquote"><p>
Buffers completion events until they are dequeued by an asynchronous
event demultiplexer.
</p></blockquote></div>
<p>
— Completion Handler
</p>
<div class="blockquote"><blockquote class="blockquote"><p>
Processes the result of an asynchronous operation. These are function
objects, often created using <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">bind</span></code>.
</p></blockquote></div>
<p>
— Asynchronous Event Demultiplexer
</p>
<div class="blockquote"><blockquote class="blockquote"><p>
Blocks waiting for events to occur on the completion event queue, and
returns a completed event to its caller.
</p></blockquote></div>
<p>
— Proactor
</p>
<div class="blockquote"><blockquote class="blockquote"><p>
Calls the asynchronous event demultiplexer to dequeue events, and dispatches
the completion handler (i.e. invokes the function object) associated
with the event. This abstraction is represented by the <code class="computeroutput"><span class="identifier">io_context</span></code> class.
</p></blockquote></div>
<p>
— Initiator
</p>
<div class="blockquote"><blockquote class="blockquote"><p>
Application-specific code that starts asynchronous operations. The initiator
interacts with an asynchronous operation processor via a high-level interface
such as <code class="computeroutput"><span class="identifier">basic_stream_socket</span></code>,
which in turn delegates to a service like <code class="computeroutput"><span class="identifier">reactive_socket_service</span></code>.
</p></blockquote></div>
<h6>
<a name="asio.overview.core.async.h1"></a>
<span><a name="asio.overview.core.async.implementation_using_reactor"></a></span><a class="link" href="async.html#asio.overview.core.async.implementation_using_reactor">Implementation
Using Reactor</a>
</h6>
<p>
On many platforms, Asio implements the Proactor design pattern in terms
of a Reactor, such as <code class="computeroutput"><span class="identifier">select</span></code>,
<code class="computeroutput"><span class="identifier">epoll</span></code> or <code class="computeroutput"><span class="identifier">kqueue</span></code>. This implementation approach
corresponds to the Proactor design pattern as follows:
</p>
<p>
— Asynchronous Operation Processor
</p>
<div class="blockquote"><blockquote class="blockquote"><p>
A reactor implemented using <code class="computeroutput"><span class="identifier">select</span></code>,
<code class="computeroutput"><span class="identifier">epoll</span></code> or <code class="computeroutput"><span class="identifier">kqueue</span></code>. When the reactor indicates
that the resource is ready to perform the operation, the processor executes
the asynchronous operation and enqueues the associated completion handler
on the completion event queue.
</p></blockquote></div>
<p>
— Completion Event Queue
</p>
<div class="blockquote"><blockquote class="blockquote"><p>
A linked list of completion handlers (i.e. function objects).
</p></blockquote></div>
<p>
— Asynchronous Event Demultiplexer
</p>
<div class="blockquote"><blockquote class="blockquote"><p>
This is implemented by waiting on an event or condition variable until
a completion handler is available in the completion event queue.
</p></blockquote></div>
<h6>
<a name="asio.overview.core.async.h2"></a>
<span><a name="asio.overview.core.async.implementation_using_windows_overlapped_i_o"></a></span><a class="link" href="async.html#asio.overview.core.async.implementation_using_windows_overlapped_i_o">Implementation
Using Windows Overlapped I/O</a>
</h6>
<p>
On Windows NT, 2000 and XP, Asio takes advantage of overlapped I/O to provide
an efficient implementation of the Proactor design pattern. This implementation
approach corresponds to the Proactor design pattern as follows:
</p>
<p>
— Asynchronous Operation Processor
</p>
<div class="blockquote"><blockquote class="blockquote"><p>
This is implemented by the operating system. Operations are initiated
by calling an overlapped function such as <code class="computeroutput"><span class="identifier">AcceptEx</span></code>.
</p></blockquote></div>
<p>
— Completion Event Queue
</p>
<div class="blockquote"><blockquote class="blockquote"><p>
This is implemented by the operating system, and is associated with an
I/O completion port. There is one I/O completion port for each <code class="computeroutput"><span class="identifier">io_context</span></code> instance.
</p></blockquote></div>
<p>
— Asynchronous Event Demultiplexer
</p>
<div class="blockquote"><blockquote class="blockquote"><p>
Called by Asio to dequeue events and their associated completion handlers.
</p></blockquote></div>
<h6>
<a name="asio.overview.core.async.h3"></a>
<span><a name="asio.overview.core.async.advantages"></a></span><a class="link" href="async.html#asio.overview.core.async.advantages">Advantages</a>
</h6>
<p>
— Portability.
</p>
<div class="blockquote"><blockquote class="blockquote"><p>
Many operating systems offer a native asynchronous I/O API (such as overlapped
I/O on <span class="emphasis"><em>Windows</em></span>) as the preferred option for developing
high performance network applications. The library may be implemented
in terms of native asynchronous I/O. However, if native support is not
available, the library may also be implemented using synchronous event
demultiplexors that typify the Reactor pattern, such as <span class="emphasis"><em>POSIX</em></span>
<code class="computeroutput"><span class="identifier">select</span><span class="special">()</span></code>.
</p></blockquote></div>
<p>
— Decoupling threading from concurrency.
</p>
<div class="blockquote"><blockquote class="blockquote"><p>
Long-duration operations are performed asynchronously by the implementation
on behalf of the application. Consequently applications do not need to
spawn many threads in order to increase concurrency.
</p></blockquote></div>
<p>
— Performance and scalability.
</p>
<div class="blockquote"><blockquote class="blockquote"><p>
Implementation strategies such as thread-per-connection (which a synchronous-only
approach would require) can degrade system performance, due to increased
context switching, synchronisation and data movement among CPUs. With
asynchronous operations it is possible to avoid the cost of context switching
by minimising the number of operating system threads — typically a limited
resource — and only activating the logical threads of control that have
events to process.
</p></blockquote></div>
<p>
— Simplified application synchronisation.
</p>
<div class="blockquote"><blockquote class="blockquote"><p>
Asynchronous operation completion handlers can be written as though they
exist in a single-threaded environment, and so application logic can
be developed with little or no concern for synchronisation issues.
</p></blockquote></div>
<p>
— Function composition.
</p>
<div class="blockquote"><blockquote class="blockquote"><p>
Function composition refers to the implementation of functions to provide
a higher-level operation, such as sending a message in a particular format.
Each function is implemented in terms of multiple calls to lower-level
read or write operations.
</p></blockquote></div>
<div class="blockquote"><blockquote class="blockquote"><p>
For example, consider a protocol where each message consists of a fixed-length
header followed by a variable length body, where the length of the body
is specified in the header. A hypothetical read_message operation could
be implemented using two lower-level reads, the first to receive the
header and, once the length is known, the second to receive the body.
</p></blockquote></div>
<div class="blockquote"><blockquote class="blockquote"><p>
To compose functions in an asynchronous model, asynchronous operations
can be chained together. That is, a completion handler for one operation
can initiate the next. Starting the first call in the chain can be encapsulated
so that the caller need not be aware that the higher-level operation
is implemented as a chain of asynchronous operations.
</p></blockquote></div>
<div class="blockquote"><blockquote class="blockquote"><p>
The ability to compose new operations in this way simplifies the development
of higher levels of abstraction above a networking library, such as functions
to support a specific protocol.
</p></blockquote></div>
<h6>
<a name="asio.overview.core.async.h4"></a>
<span><a name="asio.overview.core.async.disadvantages"></a></span><a class="link" href="async.html#asio.overview.core.async.disadvantages">Disadvantages</a>
</h6>
<p>
— Program complexity.
</p>
<div class="blockquote"><blockquote class="blockquote"><p>
It is more difficult to develop applications using asynchronous mechanisms
due to the separation in time and space between operation initiation
and completion. Applications may also be harder to debug due to the inverted
flow of control.
</p></blockquote></div>
<p>
— Memory usage.
</p>
<div class="blockquote"><blockquote class="blockquote"><p>
Buffer space must be committed for the duration of a read or write operation,
which may continue indefinitely, and a separate buffer is required for
each concurrent operation. The Reactor pattern, on the other hand, does
not require buffer space until a socket is ready for reading or writing.
</p></blockquote></div>
<h6>
<a name="asio.overview.core.async.h5"></a>
<span><a name="asio.overview.core.async.references"></a></span><a class="link" href="async.html#asio.overview.core.async.references">References</a>
</h6>
<p>
[POSA2] D. Schmidt et al, <span class="emphasis"><em>Pattern Oriented Software Architecture,
Volume 2</em></span>. Wiley, 2000.
</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-2020 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="basics.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../core.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="threads.html"><img src="../../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,172 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Basic Asio Anatomy</title>
<link rel="stylesheet" href="../../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../../index.html" title="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="asio C++ library" width="250" height="60" src="../../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="../core.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../core.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="async.html"><img src="../../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h4 class="title">
<a name="asio.overview.core.basics"></a><a class="link" href="basics.html" title="Basic Asio Anatomy">Basic Asio Anatomy</a>
</h4></div></div></div>
<p>
Asio may be used to perform both synchronous and asynchronous operations
on I/O objects such as sockets. Before using Asio it may be useful to get
a conceptual picture of the various parts of 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>I/O execution context</strong></span>, such as an <code class="computeroutput"><span class="identifier">asio</span><span class="special">::</span><span class="identifier">io_context</span></code> object, <code class="computeroutput"><span class="identifier">asio</span><span class="special">::</span><span class="identifier">thread_pool</span></code>
object, or <code class="computeroutput"><span class="identifier">asio</span><span class="special">::</span><span class="identifier">system_context</span></code>. This <span class="bold"><strong>I/O
execution context</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">asio</span><span class="special">::</span><span class="identifier">io_context</span> <span class="identifier">io_context</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">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_context</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>I/O execution context</strong></span>.
</p>
<p>
3. The <span class="bold"><strong>I/O execution context</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>I/O execution context</strong></span>.
</p>
<p>
5. The <span class="bold"><strong>I/O execution context</strong></span> translates
any error resulting from the operation into an object of type <code class="computeroutput"><span class="identifier">asio</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">asio</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">asio</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">asio</span><span class="special">::</span><span class="identifier">error_code</span><span class="special">&amp;</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>I/O execution context</strong></span>.
</p>
<p>
3. The <span class="bold"><strong>I/O execution context</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>I/O execution context</strong></span>.
</p>
<p>
5. When using an <code class="computeroutput"><span class="identifier">io_context</span></code>
as the <span class="bold"><strong>I/O execution context</strong></span>, <span class="bold"><strong>your program</strong></span> must make a call to <code class="computeroutput"><span class="identifier">io_context</span><span class="special">::</span><span class="identifier">run</span><span class="special">()</span></code> (or to one of the similar <code class="computeroutput"><span class="identifier">io_context</span></code> member functions) in order
for the result to be retrieved. A call to <code class="computeroutput"><span class="identifier">io_context</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_context</span><span class="special">::</span><span class="identifier">run</span><span class="special">()</span></code>, the <span class="bold"><strong>I/O execution
context</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 Asio operates. You will want to delve
further into the documentation if your needs are more advanced, such as
extending 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-2020 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="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../core.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="async.html"><img src="../../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,235 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Buffers</title>
<link rel="stylesheet" href="../../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../../index.html" title="Asio">
<link rel="up" href="../core.html" title="Core Concepts and Functionality">
<link rel="prev" href="strands.html" title="Strands: Use Threads Without Explicit Locking">
<link rel="next" href="streams.html" title="Streams, Short Reads and Short Writes">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="strands.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../core.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="streams.html"><img src="../../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h4 class="title">
<a name="asio.overview.core.buffers"></a><a class="link" href="buffers.html" title="Buffers">Buffers</a>
</h4></div></div></div>
<p>
Fundamentally, I/O involves the transfer of data to and from contiguous
regions of memory, called buffers. These buffers can be simply expressed
as a tuple consisting of a pointer and a size in bytes. However, to allow
the development of efficient network applications, Asio includes support
for scatter-gather operations. These operations involve one or more buffers:
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem">
A scatter-read receives data into multiple buffers.
</li>
<li class="listitem">
A gather-write transmits multiple buffers.
</li>
</ul></div>
<p>
Therefore we require an abstraction to represent a collection of buffers.
The approach used in Asio is to define a type (actually two types) to represent
a single buffer. These can be stored in a container, which may be passed
to the scatter-gather operations.
</p>
<p>
In addition to specifying buffers as a pointer and size in bytes, Asio
makes a distinction between modifiable memory (called mutable) and non-modifiable
memory (where the latter is created from the storage for a const-qualified
variable). These two types could therefore be defined as follows:
</p>
<pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special">&lt;</span><span class="keyword">void</span><span class="special">*,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span><span class="special">&gt;</span> <span class="identifier">mutable_buffer</span><span class="special">;</span>
<span class="keyword">typedef</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special">&lt;</span><span class="keyword">const</span> <span class="keyword">void</span><span class="special">*,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span><span class="special">&gt;</span> <span class="identifier">const_buffer</span><span class="special">;</span>
</pre>
<p>
Here, a mutable_buffer would be convertible to a const_buffer, but conversion
in the opposite direction is not valid.
</p>
<p>
However, Asio does not use the above definitions as-is, but instead defines
two classes: <code class="computeroutput"><span class="identifier">mutable_buffer</span></code>
and <code class="computeroutput"><span class="identifier">const_buffer</span></code>. The goal
of these is to provide an opaque representation of contiguous memory, where:
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem">
Types behave as std::pair would in conversions. That is, a <code class="computeroutput"><span class="identifier">mutable_buffer</span></code> is convertible to
a <code class="computeroutput"><span class="identifier">const_buffer</span></code>, but
the opposite conversion is disallowed.
</li>
<li class="listitem">
There is protection against buffer overruns. Given a buffer instance,
a user can only create another buffer representing the same range of
memory or a sub-range of it. To provide further safety, the library
also includes mechanisms for automatically determining the size of
a buffer from an array, <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">array</span></code>
or <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span></code> of POD elements, or from a
<code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span></code>.
</li>
<li class="listitem">
The underlying memory is explicitly accessed using the <code class="computeroutput"><span class="identifier">data</span><span class="special">()</span></code>
member function. In general an application should never need to do
this, but it is required by the library implementation to pass the
raw memory to the underlying operating system functions.
</li>
</ul></div>
<p>
Finally, multiple buffers can be passed to scatter-gather operations (such
as <a class="link" href="../../reference/read.html" title="read">read()</a> or <a class="link" href="../../reference/write.html" title="write">write()</a>)
by putting the buffer objects into a container. The <code class="computeroutput"><span class="identifier">MutableBufferSequence</span></code>
and <code class="computeroutput"><span class="identifier">ConstBufferSequence</span></code>
concepts have been defined so that containers such as <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span></code>,
<code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">list</span></code>, <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">array</span></code>
or <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">array</span></code> can be used.
</p>
<h6>
<a name="asio.overview.core.buffers.h0"></a>
<span><a name="asio.overview.core.buffers.streambuf_for_integration_with_iostreams"></a></span><a class="link" href="buffers.html#asio.overview.core.buffers.streambuf_for_integration_with_iostreams">Streambuf
for Integration with Iostreams</a>
</h6>
<p>
The class <code class="computeroutput"><span class="identifier">asio</span><span class="special">::</span><span class="identifier">basic_streambuf</span></code> is derived from <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">basic_streambuf</span></code> to associate the input
sequence and output sequence with one or more objects of some character
array type, whose elements store arbitrary values. These character array
objects are internal to the streambuf object, but direct access to the
array elements is provided to permit them to be used with I/O operations,
such as the send or receive operations of a socket:
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem">
The input sequence of the streambuf is accessible via the <a class="link" href="../../reference/basic_streambuf/data.html" title="basic_streambuf::data">data()</a>
member function. The return type of this function meets the <code class="computeroutput"><span class="identifier">ConstBufferSequence</span></code> requirements.
</li>
<li class="listitem">
The output sequence of the streambuf is accessible via the <a class="link" href="../../reference/basic_streambuf/prepare.html" title="basic_streambuf::prepare">prepare()</a>
member function. The return type of this function meets the <code class="computeroutput"><span class="identifier">MutableBufferSequence</span></code> requirements.
</li>
<li class="listitem">
Data is transferred from the front of the output sequence to the back
of the input sequence by calling the <a class="link" href="../../reference/basic_streambuf/commit.html" title="basic_streambuf::commit">commit()</a>
member function.
</li>
<li class="listitem">
Data is removed from the front of the input sequence by calling the
<a class="link" href="../../reference/basic_streambuf/consume.html" title="basic_streambuf::consume">consume()</a>
member function.
</li>
</ul></div>
<p>
The streambuf constructor accepts a <code class="computeroutput"><span class="identifier">size_t</span></code>
argument specifying the maximum of the sum of the sizes of the input sequence
and output sequence. Any operation that would, if successful, grow the
internal data beyond this limit will throw a <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">length_error</span></code>
exception.
</p>
<h6>
<a name="asio.overview.core.buffers.h1"></a>
<span><a name="asio.overview.core.buffers.bytewise_traversal_of_buffer_sequences"></a></span><a class="link" href="buffers.html#asio.overview.core.buffers.bytewise_traversal_of_buffer_sequences">Bytewise
Traversal of Buffer Sequences</a>
</h6>
<p>
The <code class="computeroutput"><span class="identifier">buffers_iterator</span><span class="special">&lt;&gt;</span></code>
class template allows buffer sequences (i.e. types meeting <code class="computeroutput"><span class="identifier">MutableBufferSequence</span></code> or <code class="computeroutput"><span class="identifier">ConstBufferSequence</span></code> requirements) to
be traversed as though they were a contiguous sequence of bytes. Helper
functions called buffers_begin() and buffers_end() are also provided, where
the buffers_iterator&lt;&gt; template parameter is automatically deduced.
</p>
<p>
As an example, to read a single line from a socket and into a <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span></code>, you may write:
</p>
<pre class="programlisting"><span class="identifier">asio</span><span class="special">::</span><span class="identifier">streambuf</span> <span class="identifier">sb</span><span class="special">;</span>
<span class="special">...</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">n</span> <span class="special">=</span> <span class="identifier">asio</span><span class="special">::</span><span class="identifier">read_until</span><span class="special">(</span><span class="identifier">sock</span><span class="special">,</span> <span class="identifier">sb</span><span class="special">,</span> <span class="char">'\n'</span><span class="special">);</span>
<span class="identifier">asio</span><span class="special">::</span><span class="identifier">streambuf</span><span class="special">::</span><span class="identifier">const_buffers_type</span> <span class="identifier">bufs</span> <span class="special">=</span> <span class="identifier">sb</span><span class="special">.</span><span class="identifier">data</span><span class="special">();</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">line</span><span class="special">(</span>
<span class="identifier">asio</span><span class="special">::</span><span class="identifier">buffers_begin</span><span class="special">(</span><span class="identifier">bufs</span><span class="special">),</span>
<span class="identifier">asio</span><span class="special">::</span><span class="identifier">buffers_begin</span><span class="special">(</span><span class="identifier">bufs</span><span class="special">)</span> <span class="special">+</span> <span class="identifier">n</span><span class="special">);</span>
</pre>
<h6>
<a name="asio.overview.core.buffers.h2"></a>
<span><a name="asio.overview.core.buffers.buffer_debugging"></a></span><a class="link" href="buffers.html#asio.overview.core.buffers.buffer_debugging">Buffer
Debugging</a>
</h6>
<p>
Some standard library implementations, such as the one that ships with
Microsoft Visual C++ 8.0 and later, provide a feature called iterator debugging.
What this means is that the validity of iterators is checked at runtime.
If a program tries to use an iterator that has been invalidated, an assertion
will be triggered. For example:
</p>
<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;</span> <span class="identifier">v</span><span class="special">(</span><span class="number">1</span><span class="special">)</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="keyword">int</span><span class="special">&gt;::</span><span class="identifier">iterator</span> <span class="identifier">i</span> <span class="special">=</span> <span class="identifier">v</span><span class="special">.</span><span class="identifier">begin</span><span class="special">();</span>
<span class="identifier">v</span><span class="special">.</span><span class="identifier">clear</span><span class="special">();</span> <span class="comment">// invalidates iterators</span>
<span class="special">*</span><span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="comment">// assertion!</span>
</pre>
<p>
Asio takes advantage of this feature to add buffer debugging. Consider
the following code:
</p>
<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">dont_do_this</span><span class="special">()</span>
<span class="special">{</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">msg</span> <span class="special">=</span> <span class="string">"Hello, world!"</span><span class="special">;</span>
<span class="identifier">asio</span><span class="special">::</span><span class="identifier">async_write</span><span class="special">(</span><span class="identifier">sock</span><span class="special">,</span> <span class="identifier">asio</span><span class="special">::</span><span class="identifier">buffer</span><span class="special">(</span><span class="identifier">msg</span><span class="special">),</span> <span class="identifier">my_handler</span><span class="special">);</span>
<span class="special">}</span>
</pre>
<p>
When you call an asynchronous read or write you need to ensure that the
buffers for the operation are valid until the completion handler is called.
In the above example, the buffer is the <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span></code>
variable <code class="computeroutput"><span class="identifier">msg</span></code>. This variable
is on the stack, and so it goes out of scope before the asynchronous operation
completes. If you're lucky then the application will crash, but random
failures are more likely.
</p>
<p>
When buffer debugging is enabled, Asio stores an iterator into the string
until the asynchronous operation completes, and then dereferences it to
check its validity. In the above example you would observe an assertion
failure just before Asio tries to call the completion handler.
</p>
<p>
This feature is automatically made available for Microsoft Visual Studio
8.0 or later and for GCC when <code class="computeroutput"><span class="identifier">_GLIBCXX_DEBUG</span></code>
is defined. There is a performance cost to this checking, so buffer debugging
is only enabled in debug builds. For other compilers it may be enabled
by defining <code class="computeroutput"><span class="identifier">ASIO_ENABLE_BUFFER_DEBUGGING</span></code>.
It can also be explicitly disabled by defining <code class="computeroutput"><span class="identifier">ASIO_DISABLE_BUFFER_DEBUGGING</span></code>.
</p>
<h6>
<a name="asio.overview.core.buffers.h3"></a>
<span><a name="asio.overview.core.buffers.see_also"></a></span><a class="link" href="buffers.html#asio.overview.core.buffers.see_also">See
Also</a>
</h6>
<p>
<a class="link" href="../../reference/buffer.html" title="buffer">buffer</a>, <a class="link" href="../../reference/buffers_begin.html" title="buffers_begin">buffers_begin</a>,
<a class="link" href="../../reference/buffers_end.html" title="buffers_end">buffers_end</a>, <a class="link" href="../../reference/buffers_iterator.html" title="buffers_iterator">buffers_iterator</a>,
<a class="link" href="../../reference/const_buffer.html" title="const_buffer">const_buffer</a>, <a class="link" href="../../reference/const_buffers_1.html" title="const_buffers_1">const_buffers_1</a>, <a class="link" href="../../reference/mutable_buffer.html" title="mutable_buffer">mutable_buffer</a>, <a class="link" href="../../reference/mutable_buffers_1.html" title="mutable_buffers_1">mutable_buffers_1</a>,
<a class="link" href="../../reference/streambuf.html" title="streambuf">streambuf</a>, <a class="link" href="../../reference/ConstBufferSequence.html" title="Constant buffer sequence requirements">ConstBufferSequence</a>,
<a class="link" href="../../reference/MutableBufferSequence.html" title="Mutable buffer sequence requirements">MutableBufferSequence</a>,
<a class="link" href="../../examples/cpp03_examples.html#asio.examples.cpp03_examples.buffers">buffers example (C++03)</a>,
<a class="link" href="../../examples/cpp11_examples.html#asio.examples.cpp11_examples.buffers">buffers example (c++11)</a>.
</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-2020 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="strands.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../core.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="streams.html"><img src="../../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,168 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Concurrency Hints</title>
<link rel="stylesheet" href="../../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../../index.html" title="Asio">
<link rel="up" href="../core.html" title="Core Concepts and Functionality">
<link rel="prev" href="handler_tracking.html" title="Handler Tracking">
<link rel="next" href="coroutine.html" title="Stackless Coroutines">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="handler_tracking.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../core.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="coroutine.html"><img src="../../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h4 class="title">
<a name="asio.overview.core.concurrency_hint"></a><a class="link" href="concurrency_hint.html" title="Concurrency Hints">Concurrency Hints</a>
</h4></div></div></div>
<p>
The <a class="link" href="../../reference/io_context/io_context.html" title="io_context::io_context"><code class="computeroutput"><span class="identifier">io_context</span></code> constructor</a> allows
programs to specify a concurrency hint. This is a suggestion to the <code class="computeroutput"><span class="identifier">io_context</span></code> implementation as to the number
of active threads that should be used for running completion handlers.
</p>
<p>
When the Windows I/O completion port backend is in use, this value is passed
to <code class="literal">CreateIoCompletionPort</code>.
</p>
<p>
When a reactor-based backend is used, the implementation recognises the
following special concurrency hint values:
</p>
<div class="informaltable"><table class="table">
<colgroup>
<col>
<col>
</colgroup>
<thead><tr>
<th>
<p>
Value
</p>
</th>
<th>
<p>
Description
</p>
</th>
</tr></thead>
<tbody>
<tr>
<td>
<p>
<code class="computeroutput"><span class="number">1</span></code>
</p>
</td>
<td>
<p>
The implementation assumes that the <code class="computeroutput"><span class="identifier">io_context</span></code>
will be run from a single thread, and applies several optimisations
based on this assumption.
</p>
<p>
For example, when a handler is posted from within another handler,
the new handler is added to a fast thread-local queue (with the
consequence that the new handler is held back until the currently
executing handler finishes).
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput"><span class="identifier">ASIO_CONCURRENCY_HINT_UNSAFE</span></code>
</p>
</td>
<td>
<p>
This special concurrency hint disables locking in both the scheduler
and reactor I/O. This hint has the following restrictions:
</p>
<p>
— Care must be taken to ensure that all operations on the <code class="computeroutput"><span class="identifier">io_context</span></code> and any of its associated
I/O objects (such as sockets and timers) occur in only one thread
at a time.
</p>
<p>
— Asynchronous resolve operations fail with <code class="computeroutput"><span class="identifier">operation_not_supported</span></code>.
</p>
<p>
— If a <code class="computeroutput"><span class="identifier">signal_set</span></code>
is used with the <code class="computeroutput"><span class="identifier">io_context</span></code>,
<code class="computeroutput"><span class="identifier">signal_set</span></code> objects
cannot be used with any other io_context in the program.
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput"><span class="identifier">ASIO_CONCURRENCY_HINT_UNSAFE_IO</span></code>
</p>
</td>
<td>
<p>
This special concurrency hint disables locking in the reactor
I/O. This hint has the following restrictions:
</p>
<p>
— Care must be taken to ensure that run functions on the <code class="computeroutput"><span class="identifier">io_context</span></code>, and all operations
on the context's associated I/O objects (such as sockets and
timers), occur in only one thread at a time.
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput"><span class="identifier">ASIO_CONCURRENCY_HINT_SAFE</span></code>
</p>
</td>
<td>
<p>
The default. The <code class="computeroutput"><span class="identifier">io_context</span></code>
provides full thread safety, and distinct I/O objects may be
used from any thread.
</p>
</td>
</tr>
</tbody>
</table></div>
<p>
The concurrency hint used by default-constructed <code class="computeroutput">io_context</code>
objects can be overridden at compile time by defining the <code class="computeroutput">ASIO_CONCURRENCY_HINT_DEFAULT</code>
macro. For example, specifying
</p>
<pre class="programlisting">-DASIO_CONCURRENCY_HINT_DEFAULT=1
</pre>
<p>
on the compiler command line means that a concurrency hint of <code class="computeroutput">1</code>
is used for all default-constructed <code class="computeroutput">io_context</code> objects in
the program. Similarly, the concurrency hint used by <code class="computeroutput">io_context</code>
objects constructed with <code class="computeroutput">1</code> can be overridden by defining
<code class="computeroutput">ASIO_CONCURRENCY_HINT_1</code>. For example, passing
</p>
<pre class="programlisting">-DASIO_CONCURRENCY_HINT_1=ASIO_CONCURRENCY_HINT_UNSAFE
</pre>
<p>
to the compiler will disable thread safety for all of these objects.
</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-2020 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="handler_tracking.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../core.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="coroutine.html"><img src="../../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,84 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Stackless Coroutines</title>
<link rel="stylesheet" href="../../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../../index.html" title="Asio">
<link rel="up" href="../core.html" title="Core Concepts and Functionality">
<link rel="prev" href="concurrency_hint.html" title="Concurrency Hints">
<link rel="next" href="spawn.html" title="Stackful Coroutines">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="concurrency_hint.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../core.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="spawn.html"><img src="../../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h4 class="title">
<a name="asio.overview.core.coroutine"></a><a class="link" href="coroutine.html" title="Stackless Coroutines">Stackless Coroutines</a>
</h4></div></div></div>
<p>
The <a class="link" href="../../reference/coroutine.html" title="coroutine"><code class="computeroutput">coroutine</code></a>
class provides support for stackless coroutines. Stackless coroutines enable
programs to implement asynchronous logic in a synchronous manner, with
minimal overhead, as shown in the following example:
</p>
<pre class="programlisting">struct session : asio::coroutine
{
boost::shared_ptr&lt;tcp::socket&gt; socket_;
boost::shared_ptr&lt;std::vector&lt;char&gt; &gt; buffer_;
session(boost::shared_ptr&lt;tcp::socket&gt; socket)
: socket_(socket),
buffer_(new std::vector&lt;char&gt;(1024))
{
}
void operator()(asio::error_code ec = asio::error_code(), std::size_t n = 0)
{
if (!ec) reenter (this)
{
for (;;)
{
yield socket_-&gt;async_read_some(asio::buffer(*buffer_), *this);
yield asio::async_write(*socket_, asio::buffer(*buffer_, n), *this);
}
}
}
};
</pre>
<p>
The <code class="computeroutput">coroutine</code> class is used in conjunction with the pseudo-keywords
<code class="computeroutput">reenter</code>, <code class="computeroutput">yield</code> and <code class="computeroutput">fork</code>. These are
preprocessor macros, and are implemented in terms of a <code class="computeroutput">switch</code>
statement using a technique similar to Duff's Device. The <a class="link" href="../../reference/coroutine.html" title="coroutine"><code class="computeroutput">coroutine</code></a>
class's documentation provides a complete description of these pseudo-keywords.
</p>
<h6>
<a name="asio.overview.core.coroutine.h0"></a>
<span><a name="asio.overview.core.coroutine.see_also"></a></span><a class="link" href="coroutine.html#asio.overview.core.coroutine.see_also">See
Also</a>
</h6>
<p>
<a class="link" href="../../reference/coroutine.html" title="coroutine">coroutine</a>, <a class="link" href="../../examples/cpp03_examples.html#asio.examples.cpp03_examples.http_server_4">HTTP
Server 4 example</a>, <a class="link" href="spawn.html" title="Stackful Coroutines">Stackful
Coroutines</a>.
</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-2020 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="concurrency_hint.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../core.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="spawn.html"><img src="../../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,132 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Coroutines TS Support</title>
<link rel="stylesheet" href="../../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../../index.html" title="Asio">
<link rel="up" href="../core.html" title="Core Concepts and Functionality">
<link rel="prev" href="spawn.html" title="Stackful Coroutines">
<link rel="next" href="../networking.html" title="Networking">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="spawn.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../core.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="../networking.html"><img src="../../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h4 class="title">
<a name="asio.overview.core.coroutines_ts"></a><a class="link" href="coroutines_ts.html" title="Coroutines TS Support">Coroutines TS Support</a>
</h4></div></div></div>
<p>
Support for the Coroutines TS is provided via the <a class="link" href="../../reference/awaitable.html" title="awaitable"><code class="computeroutput">awaitable</code></a>
class template, the <a class="link" href="../../reference/use_awaitable_t.html" title="use_awaitable_t"><code class="computeroutput">use_awaitable</code></a>
completion token, and the <a class="link" href="../../reference/co_spawn.html" title="co_spawn"><code class="computeroutput">co_spawn()</code></a>
function. These facilities allow programs to implement asynchronous logic
in a synchronous manner, in conjunction with the <code class="computeroutput">co_await</code>
keyword, as shown in the following example:
</p>
<pre class="programlisting">asio::co_spawn(executor, echo(std::move(socket)), asio::detached);
// ...
asio::awaitable&lt;void&gt; echo(tcp::socket socket)
{
try
{
char data[1024];
for (;;)
{
std::size_t n = co_await socket.async_read_some(asio::buffer(data), asio::use_awaitable);
co_await async_write(socket, asio::buffer(data, n), asio::use_awaitable);
}
}
catch (std::exception&amp; e)
{
std::printf("echo Exception: %s\n", e.what());
}
}
</pre>
<p>
The first argument to <code class="computeroutput">co_spawn()</code> is an <a class="link" href="../../reference/Executor1.html" title="Executor requirements">executor</a>
that determines the context in which the coroutine is permitted to execute.
For example, a server's per-client object may consist of multiple coroutines;
they should all run on the same <code class="computeroutput">strand</code> so that no explicit
synchronisation is required.
</p>
<p>
The second argument is an <a class="link" href="../../reference/awaitable.html" title="awaitable"><code class="computeroutput">awaitable&lt;R&gt;</code></a>,
that is the result of the coroutine's entry point function, and in the
above example is the result of the call to <code class="computeroutput">echo</code>. (Alternatively,
this argument can be a function object that returns the <a class="link" href="../../reference/awaitable.html" title="awaitable"><code class="computeroutput">awaitable&lt;R&gt;</code></a>.)
The template parameter <code class="computeroutput">R</code> is the type of return value produced
by the coroutine. In the above example, the coroutine returns <code class="computeroutput">void</code>.
</p>
<p>
The third argument is a completion token, and this is used by <code class="computeroutput">co_spawn()</code>
to produce a completion handler with signature <code class="computeroutput">void(std::exception_ptr,
R)</code>. This completion handler is invoked with the result of the coroutine
once it has finished. In the above example we pass a completion token type,
<a class="link" href="../../reference/detached.html" title="detached"><code class="computeroutput">asio::detached</code></a>,
which is used to explicitly ignore the result of an asynchronous operation.
</p>
<p>
In this example the body of the coroutine is implemented in the <code class="computeroutput">echo</code>
function. When the <code class="computeroutput">use_awaitable</code> completion token is passed
to an asynchronous operation, the operation's initiating function returns
an <code class="computeroutput">awaitable</code> that may be used with the <code class="computeroutput">co_await</code>
keyword:
</p>
<pre class="programlisting">std::size_t n = co_await socket.async_read_some(asio::buffer(data), asio::use_awaitable);
</pre>
<p>
Where an asynchronous operation's handler signature has the form:
</p>
<pre class="programlisting">void handler(asio::error_code ec, result_type result);
</pre>
<p>
the resulting type of the <code class="computeroutput">co_await</code> expression is <code class="computeroutput">result_type</code>.
In the <code class="computeroutput">async_read_some</code> example above, this is <code class="computeroutput">size_t</code>.
If the asynchronous operation fails, the <code class="computeroutput">error_code</code> is converted
into a <code class="computeroutput">system_error</code> exception and thrown.
</p>
<p>
Where a handler signature has the form:
</p>
<pre class="programlisting">void handler(asio::error_code ec);
</pre>
<p>
the <code class="computeroutput">co_await</code> expression produces a <code class="computeroutput">void</code> result.
As above, an error is passed back to the coroutine as a <code class="computeroutput">system_error</code>
exception.
</p>
<h6>
<a name="asio.overview.core.coroutines_ts.h0"></a>
<span><a name="asio.overview.core.coroutines_ts.see_also"></a></span><a class="link" href="coroutines_ts.html#asio.overview.core.coroutines_ts.see_also">See
Also</a>
</h6>
<p>
<a class="link" href="../../reference/co_spawn.html" title="co_spawn">co_spawn</a>, <a class="link" href="../../reference/detached.html" title="detached">detached</a>,
<a class="link" href="../../reference/redirect_error.html" title="redirect_error">redirect_error</a>, <a class="link" href="../../reference/awaitable.html" title="awaitable">awaitable</a>, <a class="link" href="../../reference/use_awaitable_t.html" title="use_awaitable_t">use_awaitable_t</a>,
<a class="link" href="../../reference/use_awaitable.html" title="use_awaitable">use_awaitable</a>, <a class="link" href="../../reference/this_coro__executor.html" title="this_coro::executor">this_coro::executor</a>,
<a class="link" href="../../examples/cpp17_examples.html#asio.examples.cpp17_examples.coroutines_ts_support">Coroutines
TS examples</a>, <a class="link" href="spawn.html" title="Stackful Coroutines">Stackful Coroutines</a>,
<a class="link" href="coroutine.html" title="Stackless Coroutines">Stackless Coroutines</a>.
</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-2020 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="spawn.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../core.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="../networking.html"><img src="../../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,490 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Handler Tracking</title>
<link rel="stylesheet" href="../../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../../index.html" title="Asio">
<link rel="up" href="../core.html" title="Core Concepts and Functionality">
<link rel="prev" href="allocation.html" title="Custom Memory Allocation">
<link rel="next" href="concurrency_hint.html" title="Concurrency Hints">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="allocation.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../core.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="concurrency_hint.html"><img src="../../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h4 class="title">
<a name="asio.overview.core.handler_tracking"></a><a class="link" href="handler_tracking.html" title="Handler Tracking">Handler Tracking</a>
</h4></div></div></div>
<p>
To aid in debugging asynchronous programs, Asio provides support for handler
tracking. When enabled by defining <code class="computeroutput"><span class="identifier">ASIO_ENABLE_HANDLER_TRACKING</span></code>,
Asio writes debugging output to the standard error stream. The output records
asynchronous operations and the relationships between their handlers.
</p>
<p>
This feature is useful when debugging and you need to know how your asynchronous
operations are chained together, or what the pending asynchronous operations
are. As an illustration, here is the output when you run the HTTP Server
example, handle a single request, then shut down via Ctrl+C:
</p>
<pre class="programlisting">@asio|1589424178.741850|0*1|signal_set@0x7ffee977d878.async_wait
@asio|1589424178.742593|0*2|socket@0x7ffee977d8a8.async_accept
@asio|1589424178.742619|.2|non_blocking_accept,ec=asio.system:11
@asio|1589424178.742625|0|resolver@0x7ffee977d760.cancel
@asio|1589424195.830382|.2|non_blocking_accept,ec=system:0
@asio|1589424195.830413|&gt;2|ec=system:0
@asio|1589424195.830473|2*3|socket@0x7fa71d808230.async_receive
@asio|1589424195.830496|.3|non_blocking_recv,ec=system:0,bytes_transferred=151
@asio|1589424195.830503|2*4|socket@0x7ffee977d8a8.async_accept
@asio|1589424195.830507|.4|non_blocking_accept,ec=asio.system:11
@asio|1589424195.830510|&lt;2|
@asio|1589424195.830529|&gt;3|ec=system:0,bytes_transferred=151
@asio|1589424195.831143|3^5|in 'async_write' (./../../../include/asio/impl/write.hpp:330)
@asio|1589424195.831143|3*5|socket@0x7fa71d808230.async_send
@asio|1589424195.831186|.5|non_blocking_send,ec=system:0,bytes_transferred=1090
@asio|1589424195.831194|&lt;3|
@asio|1589424195.831218|&gt;5|ec=system:0,bytes_transferred=1090
@asio|1589424195.831263|5|socket@0x7fa71d808230.close
@asio|1589424195.831298|&lt;5|
@asio|1589424199.793770|&gt;1|ec=system:0,signal_number=2
@asio|1589424199.793781|1|socket@0x7ffee977d8a8.close
@asio|1589424199.793809|&lt;1|
@asio|1589424199.793840|&gt;4|ec=asio.system:125
@asio|1589424199.793854|&lt;4|
@asio|1589424199.793883|0|signal_set@0x7ffee977d878.cancel
</pre>
<p>
Each line is of the form:
</p>
<pre class="programlisting">&lt;tag&gt;|&lt;timestamp&gt;|&lt;action&gt;|&lt;description&gt;
</pre>
<p>
The <code class="computeroutput">&lt;tag&gt;</code> is always <code class="computeroutput">@asio</code>, and is used
to identify and extract the handler tracking messages from the program
output.
</p>
<p>
The <code class="computeroutput">&lt;timestamp&gt;</code> is seconds and microseconds from 1 Jan
1970 UTC.
</p>
<p>
The <code class="computeroutput">&lt;action&gt;</code> takes one of the following forms:
</p>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">&gt;n</span></dt>
<dd><p>
The program entered the handler number <code class="computeroutput">n</code>. The <code class="computeroutput">&lt;description&gt;</code>
shows the arguments to the handler.
</p></dd>
<dt><span class="term">&lt;n</span></dt>
<dd><p>
The program left handler number <code class="computeroutput">n</code>.
</p></dd>
<dt><span class="term">!n</span></dt>
<dd><p>
The program left handler number n due to an exception.
</p></dd>
<dt><span class="term">~n</span></dt>
<dd><p>
The handler number <code class="computeroutput">n</code> was destroyed without having been
invoked. This is usually the case for any unfinished asynchronous
operations when the <code class="computeroutput">io_context</code> is destroyed.
</p></dd>
<dt><span class="term">n^m</span></dt>
<dd><p>
The handler number <code class="computeroutput">n</code> is about to create a new asynchronous
operation with completion handler number <code class="computeroutput">m</code>. The <code class="computeroutput">&lt;description&gt;</code>
contains source location information to help identify where in the
program the asynchronous operation is being started.
</p></dd>
<dt><span class="term">n*m</span></dt>
<dd><p>
The handler number <code class="computeroutput">n</code> created a new asynchronous operation
with completion handler number <code class="computeroutput">m</code>. The <code class="computeroutput">&lt;description&gt;</code>
shows what asynchronous operation was started.
</p></dd>
<dt><span class="term">n</span></dt>
<dd><p>
The handler number <code class="computeroutput">n</code> performed some other operation.
The <code class="computeroutput">&lt;description&gt;</code> shows what function was called.
Currently only <code class="computeroutput">close()</code> and <code class="computeroutput">cancel()</code> operations
are logged, as these may affect the state of pending asynchronous
operations.
</p></dd>
<dt><span class="term">.n</span></dt>
<dd><p>
The implementation performed a system call as part of the asynchronous
operation for which handler number <code class="computeroutput">n</code> is the completion
handler. The <code class="computeroutput">&lt;description&gt;</code> shows what function
was called and its results. These tracking events are only emitted
when using a reactor-based implementation.
</p></dd>
</dl>
</div>
<p>
Where the <code class="computeroutput">&lt;description&gt;</code> shows a synchronous or asynchronous
operation, the format is <code class="computeroutput">&lt;object-type&gt;@&lt;pointer&gt;.&lt;operation&gt;</code>.
For handler entry, it shows a comma-separated list of arguments and their
values.
</p>
<p>
As shown above, Each handler is assigned a numeric identifier. Where the
handler tracking output shows a handler number of 0, it means that the
action was performed outside of any handler.
</p>
<h6>
<a name="asio.overview.core.handler_tracking.h0"></a>
<span><a name="asio.overview.core.handler_tracking.adding_location_information"></a></span><a class="link" href="handler_tracking.html#asio.overview.core.handler_tracking.adding_location_information">Adding
Location Information</a>
</h6>
<p>
Programs may augment the handler tracking output's location information
by using the macro <code class="computeroutput"><span class="identifier">ASIO_HANDLER_LOCATION</span></code>
in the source code. For example:
</p>
<pre class="programlisting"><span class="preprocessor">#define</span> <span class="identifier">HANDLER_LOCATION</span> <span class="special">\</span>
<span class="identifier">ASIO_HANDLER_LOCATION</span><span class="special">((</span><span class="identifier">__FILE__</span><span class="special">,</span> <span class="identifier">__LINE__</span><span class="special">,</span> <span class="identifier">__func__</span><span class="special">))</span>
<span class="comment">// ...</span>
<span class="keyword">void</span> <span class="identifier">do_read</span><span class="special">()</span>
<span class="special">{</span>
<span class="identifier">HANDLER_LOCATION</span><span class="special">;</span>
<span class="keyword">auto</span> <span class="identifier">self</span><span class="special">(</span><span class="identifier">shared_from_this</span><span class="special">());</span>
<span class="identifier">socket_</span><span class="special">.</span><span class="identifier">async_read_some</span><span class="special">(</span><span class="identifier">asio</span><span class="special">::</span><span class="identifier">buffer</span><span class="special">(</span><span class="identifier">data_</span><span class="special">,</span> <span class="identifier">max_length</span><span class="special">),</span>
<span class="special">[</span><span class="keyword">this</span><span class="special">,</span> <span class="identifier">self</span><span class="special">](</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">error_code</span> <span class="identifier">ec</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">length</span><span class="special">)</span>
<span class="special">{</span>
<span class="identifier">HANDLER_LOCATION</span><span class="special">;</span>
<span class="keyword">if</span> <span class="special">(!</span><span class="identifier">ec</span><span class="special">)</span>
<span class="special">{</span>
<span class="identifier">do_write</span><span class="special">(</span><span class="identifier">length</span><span class="special">);</span>
<span class="special">}</span>
<span class="special">});</span>
<span class="special">}</span>
</pre>
<p>
With the additional location information available, the handler tracking
output may include a call stack of source locations:
</p>
<pre class="programlisting">@asio|1589423304.861944|&gt;7|ec=system:0,bytes_transferred=5
@asio|1589423304.861952|7^8|in 'async_write' (./../../../include/asio/impl/write.hpp:330)
@asio|1589423304.861952|7^8|called from 'do_write' (handler_tracking/async_tcp_echo_server.cpp:62)
@asio|1589423304.861952|7^8|called from 'operator()' (handler_tracking/async_tcp_echo_server.cpp:51)
@asio|1589423304.861952|7*8|socket@0x7ff61c008230.async_send
@asio|1589423304.861975|.8|non_blocking_send,ec=system:0,bytes_transferred=5
@asio|1589423304.861980|&lt;7|
</pre>
<p>
Furthermore, if <code class="computeroutput">std::source_location</code> or <code class="computeroutput">std::experimental::source_location</code>
are available, the <a class="link" href="../../reference/use_awaitable_t.html" title="use_awaitable_t"><code class="computeroutput">use_awaitable_t</code></a>
token (when default-constructed or used as a default completion token)
will also cause handler tracking to output a source location for each newly
created asynchronous operation. A <code class="computeroutput">use_awaitable_t</code> object may
also be explicitly constructed with location information.
</p>
<h6>
<a name="asio.overview.core.handler_tracking.h1"></a>
<span><a name="asio.overview.core.handler_tracking.visual_representations"></a></span><a class="link" href="handler_tracking.html#asio.overview.core.handler_tracking.visual_representations">Visual
Representations</a>
</h6>
<p>
The handler tracking output may be post-processed using the included <code class="literal">handlerviz.pl</code>
tool to create a visual representation of the handlers (requires the GraphViz
tool <code class="literal">dot</code>).
</p>
<h6>
<a name="asio.overview.core.handler_tracking.h2"></a>
<span><a name="asio.overview.core.handler_tracking.custom_tracking"></a></span><a class="link" href="handler_tracking.html#asio.overview.core.handler_tracking.custom_tracking">Custom Tracking</a>
</h6>
<p>
Handling tracking may be customised by defining the <code class="computeroutput"><span class="identifier">ASIO_CUSTOM_HANDLER_TRACKING</span></code>
macro to the name of a header file (enclosed in <code class="computeroutput"><span class="string">""</span></code>
or <code class="computeroutput"><span class="special">&lt;&gt;</span></code>). This header
file must implement the following preprocessor macros:
</p>
<div class="informaltable"><table class="table">
<colgroup>
<col>
<col>
</colgroup>
<thead><tr>
<th>
<p>
Macro
</p>
</th>
<th>
<p>
Description
</p>
</th>
</tr></thead>
<tbody>
<tr>
<td>
<p>
<code class="computeroutput"><span class="identifier">ASIO_INHERIT_TRACKED_HANDLER</span></code>
</p>
</td>
<td>
<p>
Specifies a base class for classes that implement asynchronous
operations. When used, the macro immediately follows the class
name, so it must have the form <code class="computeroutput"><span class="special">:</span>
<span class="keyword">public</span> <span class="identifier">my_class</span></code>.
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput"><span class="identifier">ASIO_ALSO_INHERIT_TRACKED_HANDLER</span></code>
</p>
</td>
<td>
<p>
Specifies a base class for classes that implement asynchronous
operations. When used, the macro follows other base classes,
so it must have the form <code class="computeroutput"><span class="special">,</span>
<span class="keyword">public</span> <span class="identifier">my_class</span></code>.
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput"><span class="identifier">ASIO_HANDLER_TRACKING_INIT</span><span class="special">(</span><span class="identifier">args</span><span class="special">)</span></code>
</p>
</td>
<td>
<p>
An expression that is used to initialise the tracking mechanism.
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput"><span class="identifier">ASIO_HANDLER_LOCATION</span><span class="special">(</span><span class="identifier">args</span><span class="special">)</span></code>
</p>
</td>
<td>
<p>
A variable declaration that is used to define a source code location.
<code class="computeroutput"><span class="identifier">args</span></code> is a parenthesised
function argument list containing the file name, line number,
and function name.
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput"><span class="identifier">ASIO_HANDLER_CREATION</span><span class="special">(</span><span class="identifier">args</span><span class="special">)</span></code>
</p>
</td>
<td>
<p>
An expression that is called on creation of an asynchronous operation.
<code class="computeroutput"><span class="identifier">args</span></code> is a parenthesised
function argument list containing the owning execution context,
the tracked handler, the name of the object type, a pointer to
the object, the object's native handle, and the operation name.
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput"><span class="identifier">ASIO_HANDLER_COMPLETION</span><span class="special">(</span><span class="identifier">args</span><span class="special">)</span></code>
</p>
</td>
<td>
<p>
An expression that is called on completion of an asynchronous
operation. <code class="computeroutput"><span class="identifier">args</span></code>
is a parenthesised function argument list containing the tracked
handler.
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput"><span class="identifier">ASIO_HANDLER_INVOCATION_BEGIN</span><span class="special">(</span><span class="identifier">args</span><span class="special">)</span></code>
</p>
</td>
<td>
<p>
An expression that is called immediately before a completion
handler is invoked. <code class="computeroutput"><span class="identifier">args</span></code>
is a parenthesised function argument list containing the arguments
to the completion handler.
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput"><span class="identifier">ASIO_HANDLER_INVOCATION_END</span></code>
</p>
</td>
<td>
<p>
An expression that is called immediately after a completion handler
is invoked.
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput"><span class="identifier">ASIO_HANDLER_OPERATION</span><span class="special">(</span><span class="identifier">args</span><span class="special">)</span></code>
</p>
</td>
<td>
<p>
An expression that is called when some synchronous object operation
is called (such as <code class="computeroutput"><span class="identifier">close</span><span class="special">()</span></code> or <code class="computeroutput"><span class="identifier">cancel</span><span class="special">()</span></code>). <code class="computeroutput"><span class="identifier">args</span></code>
is a parenthesised function argument list containing the owning
execution context, the name of the object type, a pointer to
the object, the object's native handle, and the operation name.
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput"><span class="identifier">ASIO_HANDLER_REACTOR_REGISTRATION</span><span class="special">(</span><span class="identifier">args</span><span class="special">)</span></code>
</p>
</td>
<td>
<p>
An expression that is called when an object is registered with
the reactor. <code class="computeroutput"><span class="identifier">args</span></code>
is a parenthesised function argument list containing the owning
execution context, the object's native handle, and a unique registration
key.
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput"><span class="identifier">ASIO_HANDLER_REACTOR_DEREGISTRATION</span><span class="special">(</span><span class="identifier">args</span><span class="special">)</span></code>
</p>
</td>
<td>
<p>
An expression that is called when an object is deregistered from
the reactor. <code class="computeroutput"><span class="identifier">args</span></code>
is a parenthesised function argument list containing the owning
execution context, the object's native handle, and a unique registration
key.
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput"><span class="identifier">ASIO_HANDLER_REACTOR_READ_EVENT</span></code>
</p>
</td>
<td>
<p>
A bitmask constant used to identify reactor read readiness events.
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput"><span class="identifier">ASIO_HANDLER_REACTOR_WRITE_EVENT</span></code>
</p>
</td>
<td>
<p>
A bitmask constant used to identify reactor write readiness events.
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput"><span class="identifier">ASIO_HANDLER_REACTOR_ERROR_EVENT</span></code>
</p>
</td>
<td>
<p>
A bitmask constant used to identify reactor error readiness events.
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput"><span class="identifier">ASIO_HANDLER_REACTOR_EVENTS</span><span class="special">(</span><span class="identifier">args</span><span class="special">)</span></code>
</p>
</td>
<td>
<p>
An expression that is called when an object registered with the
reactor becomes ready. <code class="computeroutput"><span class="identifier">args</span></code>
is a parenthesised function argument list containing the owning
execution context, the unique registration key, and a bitmask
of the ready events.
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput"><span class="identifier">ASIO_HANDLER_REACTOR_OPERATION</span><span class="special">(</span><span class="identifier">args</span><span class="special">)</span></code>
</p>
</td>
<td>
<p>
An expression that is called when the implementation performs
a system call as part of a reactor-based asynchronous operation.
<code class="computeroutput"><span class="identifier">args</span></code> is a parenthesised
function argument list containing the tracked handler, the operation
name, the error code produced by the operation, and (optionally)
the number of bytes transferred.
</p>
</td>
</tr>
</tbody>
</table></div>
<h6>
<a name="asio.overview.core.handler_tracking.h3"></a>
<span><a name="asio.overview.core.handler_tracking.see_also"></a></span><a class="link" href="handler_tracking.html#asio.overview.core.handler_tracking.see_also">See
Also</a>
</h6>
<p>
<a class="link" href="../../examples/cpp11_examples.html#asio.examples.cpp11_examples.handler_tracking">Handler tracking
examples</a>.
</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-2020 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="allocation.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../core.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="concurrency_hint.html"><img src="../../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,158 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Line-Based Operations</title>
<link rel="stylesheet" href="../../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../../index.html" title="Asio">
<link rel="up" href="../core.html" title="Core Concepts and Functionality">
<link rel="prev" href="reactor.html" title="Reactor-Style Operations">
<link rel="next" href="allocation.html" title="Custom Memory Allocation">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="reactor.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../core.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="allocation.html"><img src="../../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h4 class="title">
<a name="asio.overview.core.line_based"></a><a class="link" href="line_based.html" title="Line-Based Operations">Line-Based Operations</a>
</h4></div></div></div>
<p>
Many commonly-used internet protocols are line-based, which means that
they have protocol elements that are delimited by the character sequence
<code class="computeroutput"><span class="string">"\r\n"</span></code>. Examples
include HTTP, SMTP and FTP. To more easily permit the implementation of
line-based protocols, as well as other protocols that use delimiters, Asio
includes the functions <code class="computeroutput"><span class="identifier">read_until</span><span class="special">()</span></code> and <code class="computeroutput"><span class="identifier">async_read_until</span><span class="special">()</span></code>.
</p>
<p>
The following example illustrates the use of <code class="computeroutput"><span class="identifier">async_read_until</span><span class="special">()</span></code> in an HTTP server, to receive the first
line of an HTTP request from a client:
</p>
<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">http_connection</span>
<span class="special">{</span>
<span class="special">...</span>
<span class="keyword">void</span> <span class="identifier">start</span><span class="special">()</span>
<span class="special">{</span>
<span class="identifier">asio</span><span class="special">::</span><span class="identifier">async_read_until</span><span class="special">(</span><span class="identifier">socket_</span><span class="special">,</span> <span class="identifier">data_</span><span class="special">,</span> <span class="string">"\r\n"</span><span class="special">,</span>
<span class="identifier">boost</span><span class="special">::</span><span class="identifier">bind</span><span class="special">(&amp;</span><span class="identifier">http_connection</span><span class="special">::</span><span class="identifier">handle_request_line</span><span class="special">,</span> <span class="keyword">this</span><span class="special">,</span> <span class="identifier">_1</span><span class="special">));</span>
<span class="special">}</span>
<span class="keyword">void</span> <span class="identifier">handle_request_line</span><span class="special">(</span><span class="identifier">asio</span><span class="special">::</span><span class="identifier">error_code</span> <span class="identifier">ec</span><span class="special">)</span>
<span class="special">{</span>
<span class="keyword">if</span> <span class="special">(!</span><span class="identifier">ec</span><span class="special">)</span>
<span class="special">{</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">method</span><span class="special">,</span> <span class="identifier">uri</span><span class="special">,</span> <span class="identifier">version</span><span class="special">;</span>
<span class="keyword">char</span> <span class="identifier">sp1</span><span class="special">,</span> <span class="identifier">sp2</span><span class="special">,</span> <span class="identifier">cr</span><span class="special">,</span> <span class="identifier">lf</span><span class="special">;</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">istream</span> <span class="identifier">is</span><span class="special">(&amp;</span><span class="identifier">data_</span><span class="special">);</span>
<span class="identifier">is</span><span class="special">.</span><span class="identifier">unsetf</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">ios_base</span><span class="special">::</span><span class="identifier">skipws</span><span class="special">);</span>
<span class="identifier">is</span> <span class="special">&gt;&gt;</span> <span class="identifier">method</span> <span class="special">&gt;&gt;</span> <span class="identifier">sp1</span> <span class="special">&gt;&gt;</span> <span class="identifier">uri</span> <span class="special">&gt;&gt;</span> <span class="identifier">sp2</span> <span class="special">&gt;&gt;</span> <span class="identifier">version</span> <span class="special">&gt;&gt;</span> <span class="identifier">cr</span> <span class="special">&gt;&gt;</span> <span class="identifier">lf</span><span class="special">;</span>
<span class="special">...</span>
<span class="special">}</span>
<span class="special">}</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">asio</span><span class="special">::</span><span class="identifier">streambuf</span> <span class="identifier">data_</span><span class="special">;</span>
<span class="special">};</span>
</pre>
<p>
The <code class="computeroutput"><span class="identifier">streambuf</span></code> data member
serves as a place to store the data that has been read from the socket
before it is searched for the delimiter. It is important to remember that
there may be additional data <span class="emphasis"><em>after</em></span> the delimiter.
This surplus data should be left in the <code class="computeroutput"><span class="identifier">streambuf</span></code>
so that it may be inspected by a subsequent call to <code class="computeroutput"><span class="identifier">read_until</span><span class="special">()</span></code> or <code class="computeroutput"><span class="identifier">async_read_until</span><span class="special">()</span></code>.
</p>
<p>
The delimiters may be specified as a single <code class="computeroutput"><span class="keyword">char</span></code>,
a <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span></code> or a <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">regex</span></code>.
The <code class="computeroutput"><span class="identifier">read_until</span><span class="special">()</span></code>
and <code class="computeroutput"><span class="identifier">async_read_until</span><span class="special">()</span></code>
functions also include overloads that accept a user-defined function object
called a match condition. For example, to read data into a streambuf until
whitespace is encountered:
</p>
<pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">asio</span><span class="special">::</span><span class="identifier">buffers_iterator</span><span class="special">&lt;</span>
<span class="identifier">asio</span><span class="special">::</span><span class="identifier">streambuf</span><span class="special">::</span><span class="identifier">const_buffers_type</span><span class="special">&gt;</span> <span class="identifier">iterator</span><span class="special">;</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special">&lt;</span><span class="identifier">iterator</span><span class="special">,</span> <span class="keyword">bool</span><span class="special">&gt;</span>
<span class="identifier">match_whitespace</span><span class="special">(</span><span class="identifier">iterator</span> <span class="identifier">begin</span><span class="special">,</span> <span class="identifier">iterator</span> <span class="identifier">end</span><span class="special">)</span>
<span class="special">{</span>
<span class="identifier">iterator</span> <span class="identifier">i</span> <span class="special">=</span> <span class="identifier">begin</span><span class="special">;</span>
<span class="keyword">while</span> <span class="special">(</span><span class="identifier">i</span> <span class="special">!=</span> <span class="identifier">end</span><span class="special">)</span>
<span class="keyword">if</span> <span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">isspace</span><span class="special">(*</span><span class="identifier">i</span><span class="special">++))</span>
<span class="keyword">return</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">make_pair</span><span class="special">(</span><span class="identifier">i</span><span class="special">,</span> <span class="keyword">true</span><span class="special">);</span>
<span class="keyword">return</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">make_pair</span><span class="special">(</span><span class="identifier">i</span><span class="special">,</span> <span class="keyword">false</span><span class="special">);</span>
<span class="special">}</span>
<span class="special">...</span>
<span class="identifier">asio</span><span class="special">::</span><span class="identifier">streambuf</span> <span class="identifier">b</span><span class="special">;</span>
<span class="identifier">asio</span><span class="special">::</span><span class="identifier">read_until</span><span class="special">(</span><span class="identifier">s</span><span class="special">,</span> <span class="identifier">b</span><span class="special">,</span> <span class="identifier">match_whitespace</span><span class="special">);</span>
</pre>
<p>
To read data into a streambuf until a matching character is found:
</p>
<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">match_char</span>
<span class="special">{</span>
<span class="keyword">public</span><span class="special">:</span>
<span class="keyword">explicit</span> <span class="identifier">match_char</span><span class="special">(</span><span class="keyword">char</span> <span class="identifier">c</span><span class="special">)</span> <span class="special">:</span> <span class="identifier">c_</span><span class="special">(</span><span class="identifier">c</span><span class="special">)</span> <span class="special">{}</span>
<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">typename</span> <span class="identifier">Iterator</span><span class="special">&gt;</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special">&lt;</span><span class="identifier">Iterator</span><span class="special">,</span> <span class="keyword">bool</span><span class="special">&gt;</span> <span class="keyword">operator</span><span class="special">()(</span>
<span class="identifier">Iterator</span> <span class="identifier">begin</span><span class="special">,</span> <span class="identifier">Iterator</span> <span class="identifier">end</span><span class="special">)</span> <span class="keyword">const</span>
<span class="special">{</span>
<span class="identifier">Iterator</span> <span class="identifier">i</span> <span class="special">=</span> <span class="identifier">begin</span><span class="special">;</span>
<span class="keyword">while</span> <span class="special">(</span><span class="identifier">i</span> <span class="special">!=</span> <span class="identifier">end</span><span class="special">)</span>
<span class="keyword">if</span> <span class="special">(</span><span class="identifier">c_</span> <span class="special">==</span> <span class="special">*</span><span class="identifier">i</span><span class="special">++)</span>
<span class="keyword">return</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">make_pair</span><span class="special">(</span><span class="identifier">i</span><span class="special">,</span> <span class="keyword">true</span><span class="special">);</span>
<span class="keyword">return</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">make_pair</span><span class="special">(</span><span class="identifier">i</span><span class="special">,</span> <span class="keyword">false</span><span class="special">);</span>
<span class="special">}</span>
<span class="keyword">private</span><span class="special">:</span>
<span class="keyword">char</span> <span class="identifier">c_</span><span class="special">;</span>
<span class="special">};</span>
<span class="keyword">namespace</span> <span class="identifier">asio</span> <span class="special">{</span>
<span class="keyword">template</span> <span class="special">&lt;&gt;</span> <span class="keyword">struct</span> <span class="identifier">is_match_condition</span><span class="special">&lt;</span><span class="identifier">match_char</span><span class="special">&gt;</span>
<span class="special">:</span> <span class="keyword">public</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">true_type</span> <span class="special">{};</span>
<span class="special">}</span> <span class="comment">// namespace asio</span>
<span class="special">...</span>
<span class="identifier">asio</span><span class="special">::</span><span class="identifier">streambuf</span> <span class="identifier">b</span><span class="special">;</span>
<span class="identifier">asio</span><span class="special">::</span><span class="identifier">read_until</span><span class="special">(</span><span class="identifier">s</span><span class="special">,</span> <span class="identifier">b</span><span class="special">,</span> <span class="identifier">match_char</span><span class="special">(</span><span class="char">'a'</span><span class="special">));</span>
</pre>
<p>
The <code class="computeroutput"><span class="identifier">is_match_condition</span><span class="special">&lt;&gt;</span></code> type trait automatically evaluates
to true for functions, and for function objects with a nested <code class="computeroutput"><span class="identifier">result_type</span></code> typedef. For other types
the trait must be explicitly specialised, as shown above.
</p>
<h6>
<a name="asio.overview.core.line_based.h0"></a>
<span><a name="asio.overview.core.line_based.see_also"></a></span><a class="link" href="line_based.html#asio.overview.core.line_based.see_also">See
Also</a>
</h6>
<p>
<a class="link" href="../../reference/async_read_until.html" title="async_read_until">async_read_until()</a>,
<a class="link" href="../../reference/is_match_condition.html" title="is_match_condition">is_match_condition</a>,
<a class="link" href="../../reference/read_until.html" title="read_until">read_until()</a>, <a class="link" href="../../reference/streambuf.html" title="streambuf">streambuf</a>,
<a class="link" href="../../examples/cpp03_examples.html#asio.examples.cpp03_examples.http_client">HTTP client example</a>.
</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-2020 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="reactor.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../core.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="allocation.html"><img src="../../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,79 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Reactor-Style Operations</title>
<link rel="stylesheet" href="../../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../../index.html" title="Asio">
<link rel="up" href="../core.html" title="Core Concepts and Functionality">
<link rel="prev" href="streams.html" title="Streams, Short Reads and Short Writes">
<link rel="next" href="line_based.html" title="Line-Based Operations">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="streams.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../core.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="line_based.html"><img src="../../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h4 class="title">
<a name="asio.overview.core.reactor"></a><a class="link" href="reactor.html" title="Reactor-Style Operations">Reactor-Style Operations</a>
</h4></div></div></div>
<p>
Sometimes a program must be integrated with a third-party library that
wants to perform the I/O operations itself. To facilitate this, Asio includes
synchronous and asynchronous operations that may be used to wait for a
socket to become ready to read, ready to write, or to have a pending error
condition.
</p>
<p>
As an example, to perform a non-blocking read something like the following
may be used:
</p>
<pre class="programlisting"><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">my_io_context</span><span class="special">);</span>
<span class="special">...</span>
<span class="identifier">socket</span><span class="special">.</span><span class="identifier">non_blocking</span><span class="special">(</span><span class="keyword">true</span><span class="special">);</span>
<span class="special">...</span>
<span class="identifier">socket</span><span class="special">.</span><span class="identifier">async_wait</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="special">::</span><span class="identifier">wait_read</span><span class="special">,</span> <span class="identifier">read_handler</span><span class="special">);</span>
<span class="special">...</span>
<span class="keyword">void</span> <span class="identifier">read_handler</span><span class="special">(</span><span class="identifier">asio</span><span class="special">::</span><span class="identifier">error_code</span> <span class="identifier">ec</span><span class="special">)</span>
<span class="special">{</span>
<span class="keyword">if</span> <span class="special">(!</span><span class="identifier">ec</span><span class="special">)</span>
<span class="special">{</span>
<span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">&gt;</span> <span class="identifier">buf</span><span class="special">(</span><span class="identifier">socket</span><span class="special">.</span><span class="identifier">available</span><span class="special">());</span>
<span class="identifier">socket</span><span class="special">.</span><span class="identifier">read_some</span><span class="special">(</span><span class="identifier">buffer</span><span class="special">(</span><span class="identifier">buf</span><span class="special">));</span>
<span class="special">}</span>
<span class="special">}</span>
</pre>
<p>
These operations are supported for sockets on all platforms, and for the
POSIX stream-oriented descriptor classes.
</p>
<h6>
<a name="asio.overview.core.reactor.h0"></a>
<span><a name="asio.overview.core.reactor.see_also"></a></span><a class="link" href="reactor.html#asio.overview.core.reactor.see_also">See
Also</a>
</h6>
<p>
<a class="link" href="../../reference/basic_socket/wait.html" title="basic_socket::wait">basic_socket::wait()</a>,
<a class="link" href="../../reference/basic_socket/async_wait.html" title="basic_socket::async_wait">basic_socket::async_wait()</a>,
<a class="link" href="../../reference/basic_socket/non_blocking.html" title="basic_socket::non_blocking">basic_socket::non_blocking()</a>,
<a class="link" href="../../reference/basic_socket/native_non_blocking.html" title="basic_socket::native_non_blocking">basic_socket::native_non_blocking()</a>,
<a class="link" href="../../examples/cpp03_examples.html#asio.examples.cpp03_examples.nonblocking">nonblocking example</a>.
</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-2020 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="streams.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../core.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="line_based.html"><img src="../../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,146 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Stackful Coroutines</title>
<link rel="stylesheet" href="../../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../../index.html" title="Asio">
<link rel="up" href="../core.html" title="Core Concepts and Functionality">
<link rel="prev" href="coroutine.html" title="Stackless Coroutines">
<link rel="next" href="coroutines_ts.html" title="Coroutines TS Support">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="coroutine.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../core.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="coroutines_ts.html"><img src="../../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h4 class="title">
<a name="asio.overview.core.spawn"></a><a class="link" href="spawn.html" title="Stackful Coroutines">Stackful Coroutines</a>
</h4></div></div></div>
<p>
The <a class="link" href="../../reference/spawn.html" title="spawn"><code class="computeroutput">spawn()</code></a> function
is a high-level wrapper for running stackful coroutines. It is based on
the Boost.Coroutine library. The <code class="computeroutput">spawn()</code> function enables
programs to implement asynchronous logic in a synchronous manner, as shown
in the following example:
</p>
<pre class="programlisting">asio::spawn(my_strand, do_echo);
// ...
void do_echo(asio::yield_context yield)
{
try
{
char data[128];
for (;;)
{
std::size_t length =
my_socket.async_read_some(
asio::buffer(data), yield);
asio::async_write(my_socket,
asio::buffer(data, length), yield);
}
}
catch (std::exception&amp; e)
{
// ...
}
}
</pre>
<p>
The first argument to <code class="computeroutput">spawn()</code> may be a <a class="link" href="../../reference/io_context__strand.html" title="io_context::strand"><code class="computeroutput">strand</code></a>,
<a class="link" href="../../reference/io_context.html" title="io_context"><code class="computeroutput">io_context</code></a>,
or <a class="link" href="../../reference/CompletionHandler.html" title="Completion handler requirements">completion handler</a>.
This argument determines the context in which the coroutine is permitted
to execute. For example, a server's per-client object may consist of multiple
coroutines; they should all run on the same <code class="computeroutput">strand</code> so that
no explicit synchronisation is required.
</p>
<p>
The second argument is a function object with signature:
</p>
<pre class="programlisting">void coroutine(asio::yield_context yield);
</pre>
<p>
that specifies the code to be run as part of the coroutine. The parameter
<code class="computeroutput">yield</code> may be passed to an asynchronous operation in place
of the completion handler, as in:
</p>
<pre class="programlisting">std::size_t length =
my_socket.async_read_some(
asio::buffer(data), yield);
</pre>
<p>
This starts the asynchronous operation and suspends the coroutine. The
coroutine will be resumed automatically when the asynchronous operation
completes.
</p>
<p>
Where an asynchronous operation's handler signature has the form:
</p>
<pre class="programlisting">void handler(asio::error_code ec, result_type result);
</pre>
<p>
the initiating function returns the result_type. In the <code class="computeroutput">async_read_some</code>
example above, this is <code class="computeroutput">size_t</code>. If the asynchronous operation
fails, the <code class="computeroutput">error_code</code> is converted into a <code class="computeroutput">system_error</code>
exception and thrown.
</p>
<p>
Where a handler signature has the form:
</p>
<pre class="programlisting">void handler(asio::error_code ec);
</pre>
<p>
the initiating function returns <code class="computeroutput">void</code>. As above, an error is
passed back to the coroutine as a <code class="computeroutput">system_error</code> exception.
</p>
<p>
To collect the <code class="computeroutput">error_code</code> from an operation, rather than have
it throw an exception, associate the output variable with the <code class="computeroutput">yield_context</code>
as follows:
</p>
<pre class="programlisting">asio::error_code ec;
std::size_t length =
my_socket.async_read_some(
asio::buffer(data), yield[ec]);
</pre>
<p>
<span class="bold"><strong>Note:</strong></span> if <code class="computeroutput">spawn()</code> is used
with a custom completion handler of type <code class="computeroutput">Handler</code>, the function
object signature is actually:
</p>
<pre class="programlisting">void coroutine(asio::basic_yield_context&lt;Handler&gt; yield);
</pre>
<h6>
<a name="asio.overview.core.spawn.h0"></a>
<span><a name="asio.overview.core.spawn.see_also"></a></span><a class="link" href="spawn.html#asio.overview.core.spawn.see_also">See
Also</a>
</h6>
<p>
<a class="link" href="../../reference/spawn.html" title="spawn">spawn</a>, <a class="link" href="../../reference/yield_context.html" title="yield_context">yield_context</a>,
<a class="link" href="../../reference/basic_yield_context.html" title="basic_yield_context">basic_yield_context</a>,
<a class="link" href="../../examples/cpp03_examples.html#asio.examples.cpp03_examples.spawn">Spawn example (C++03)</a>,
<a class="link" href="../../examples/cpp11_examples.html#asio.examples.cpp11_examples.spawn">Spawn example (C++11)</a>,
<a class="link" href="coroutine.html" title="Stackless Coroutines">Stackless Coroutines</a>.
</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-2020 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="coroutine.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../core.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="coroutines_ts.html"><img src="../../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,161 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Strands: Use Threads Without Explicit Locking</title>
<link rel="stylesheet" href="../../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../../index.html" title="Asio">
<link rel="up" href="../core.html" title="Core Concepts and Functionality">
<link rel="prev" href="threads.html" title="Threads and Asio">
<link rel="next" href="buffers.html" title="Buffers">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="threads.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../core.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="buffers.html"><img src="../../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h4 class="title">
<a name="asio.overview.core.strands"></a><a class="link" href="strands.html" title="Strands: Use Threads Without Explicit Locking">Strands: Use Threads Without
Explicit Locking</a>
</h4></div></div></div>
<p>
A strand is defined as a strictly sequential invocation of event handlers
(i.e. no concurrent invocation). Use of strands allows execution of code
in a multithreaded program without the need for explicit locking (e.g.
using mutexes).
</p>
<p>
Strands may be either implicit or explicit, as illustrated by the following
alternative approaches:
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem">
Calling io_context::run() from only one thread means all event handlers
execute in an implicit strand, due to the io_context's guarantee that
handlers are only invoked from inside run().
</li>
<li class="listitem">
Where there is a single chain of asynchronous operations associated
with a connection (e.g. in a half duplex protocol implementation like
HTTP) there is no possibility of concurrent execution of the handlers.
This is an implicit strand.
</li>
<li class="listitem">
An explicit strand is an instance of <code class="computeroutput"><span class="identifier">strand</span><span class="special">&lt;&gt;</span></code> or <code class="computeroutput"><span class="identifier">io_context</span><span class="special">::</span><span class="identifier">strand</span></code>.
All event handler function objects need to be bound to the strand using
<code class="computeroutput"><span class="identifier">asio</span><span class="special">::</span><span class="identifier">bind_executor</span><span class="special">()</span></code>
or otherwise posted/dispatched through the strand object.
</li>
</ul></div>
<p>
In the case of composed asynchronous operations, such as <code class="computeroutput"><span class="identifier">async_read</span><span class="special">()</span></code>
or <code class="computeroutput"><span class="identifier">async_read_until</span><span class="special">()</span></code>,
if a completion handler goes through a strand, then all intermediate handlers
should also go through the same strand. This is needed to ensure thread
safe access for any objects that are shared between the caller and the
composed operation (in the case of <code class="computeroutput"><span class="identifier">async_read</span><span class="special">()</span></code> it's the socket, which the caller can
<code class="computeroutput"><span class="identifier">close</span><span class="special">()</span></code>
to cancel the operation).
</p>
<p>
To achieve this, all asynchronous operations obtain the handler's associated
executor by using the <code class="computeroutput"><span class="identifier">get_associated_executor</span></code>
function. For example:
</p>
<pre class="programlisting"><span class="identifier">asio</span><span class="special">::</span><span class="identifier">associated_executor_t</span><span class="special">&lt;</span><span class="identifier">Handler</span><span class="special">&gt;</span> <span class="identifier">a</span> <span class="special">=</span> <span class="identifier">asio</span><span class="special">::</span><span class="identifier">get_associated_executor</span><span class="special">(</span><span class="identifier">h</span><span class="special">);</span>
</pre>
<p>
The associated executor must satisfy the Executor requirements. It will
be used by the asynchronous operation to submit both intermediate and final
handlers for execution.
</p>
<p>
The executor may be customised for a particular handler type by specifying
a nested type <code class="computeroutput"><span class="identifier">executor_type</span></code>
and member function <code class="computeroutput"><span class="identifier">get_executor</span><span class="special">()</span></code>:
</p>
<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">my_handler</span>
<span class="special">{</span>
<span class="keyword">public</span><span class="special">:</span>
<span class="comment">// Custom implementation of Executor type requirements.</span>
<span class="keyword">typedef</span> <span class="identifier">my_executor</span> <span class="identifier">executor_type</span><span class="special">;</span>
<span class="comment">// Return a custom executor implementation.</span>
<span class="identifier">executor_type</span> <span class="identifier">get_executor</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span>
<span class="special">{</span>
<span class="keyword">return</span> <span class="identifier">my_executor</span><span class="special">();</span>
<span class="special">}</span>
<span class="keyword">void</span> <span class="keyword">operator</span><span class="special">()()</span> <span class="special">{</span> <span class="special">...</span> <span class="special">}</span>
<span class="special">};</span>
</pre>
<p>
In more complex cases, the <code class="computeroutput"><span class="identifier">associated_executor</span></code>
template may be partially specialised directly:
</p>
<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">my_handler</span>
<span class="special">{</span>
<span class="keyword">void</span> <span class="keyword">operator</span><span class="special">()()</span> <span class="special">{</span> <span class="special">...</span> <span class="special">}</span>
<span class="special">};</span>
<span class="keyword">namespace</span> <span class="identifier">asio</span> <span class="special">{</span>
<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Executor</span><span class="special">&gt;</span>
<span class="keyword">struct</span> <span class="identifier">associated_executor</span><span class="special">&lt;</span><span class="identifier">my_handler</span><span class="special">,</span> <span class="identifier">Executor</span><span class="special">&gt;</span>
<span class="special">{</span>
<span class="comment">// Custom implementation of Executor type requirements.</span>
<span class="keyword">typedef</span> <span class="identifier">my_executor</span> <span class="identifier">type</span><span class="special">;</span>
<span class="comment">// Return a custom executor implementation.</span>
<span class="keyword">static</span> <span class="identifier">type</span> <span class="identifier">get</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">my_handler</span><span class="special">&amp;,</span>
<span class="keyword">const</span> <span class="identifier">Executor</span><span class="special">&amp;</span> <span class="special">=</span> <span class="identifier">Executor</span><span class="special">())</span> <span class="keyword">noexcept</span>
<span class="special">{</span>
<span class="keyword">return</span> <span class="identifier">my_executor</span><span class="special">();</span>
<span class="special">}</span>
<span class="special">};</span>
<span class="special">}</span> <span class="comment">// namespace asio</span>
</pre>
<p>
The <code class="computeroutput"><span class="identifier">asio</span><span class="special">::</span><span class="identifier">bind_executor</span><span class="special">()</span></code>
function is a helper to bind a specific executor object, such as a strand,
to a completion handler. This binding automatically associates an executor
as shown above. For example, to bind a strand to a completion handler we
would simply write:
</p>
<pre class="programlisting"><span class="identifier">my_socket</span><span class="special">.</span><span class="identifier">async_read_some</span><span class="special">(</span><span class="identifier">my_buffer</span><span class="special">,</span>
<span class="identifier">asio</span><span class="special">::</span><span class="identifier">bind_executor</span><span class="special">(</span><span class="identifier">my_strand</span><span class="special">,</span>
<span class="special">[](</span><span class="identifier">error_code</span> <span class="identifier">ec</span><span class="special">,</span> <span class="identifier">size_t</span> <span class="identifier">length</span><span class="special">)</span>
<span class="special">{</span>
<span class="comment">// ...</span>
<span class="special">}));</span>
</pre>
<h6>
<a name="asio.overview.core.strands.h0"></a>
<span><a name="asio.overview.core.strands.see_also"></a></span><a class="link" href="strands.html#asio.overview.core.strands.see_also">See
Also</a>
</h6>
<p>
<a class="link" href="../../reference/associated_executor.html" title="associated_executor">associated_executor</a>,
<a class="link" href="../../reference/get_associated_executor.html" title="get_associated_executor">get_associated_executor</a>,
<a class="link" href="../../reference/bind_executor.html" title="bind_executor">bind_executor</a>, <a class="link" href="../../reference/strand.html" title="strand">strand</a>, <a class="link" href="../../reference/io_context__strand.html" title="io_context::strand">io_context::strand</a>,
<a class="link" href="../../tutorial/tuttimer5.html" title="Timer.5 - Synchronising handlers in multithreaded programs">tutorial Timer.5</a>, <a class="link" href="../../examples/cpp03_examples.html#asio.examples.cpp03_examples.http_server_3">HTTP server 3 example</a>.
</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-2020 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="threads.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../core.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="buffers.html"><img src="../../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,121 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Streams, Short Reads and Short Writes</title>
<link rel="stylesheet" href="../../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../../index.html" title="Asio">
<link rel="up" href="../core.html" title="Core Concepts and Functionality">
<link rel="prev" href="buffers.html" title="Buffers">
<link rel="next" href="reactor.html" title="Reactor-Style Operations">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="buffers.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../core.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="reactor.html"><img src="../../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h4 class="title">
<a name="asio.overview.core.streams"></a><a class="link" href="streams.html" title="Streams, Short Reads and Short Writes">Streams, Short Reads and
Short Writes</a>
</h4></div></div></div>
<p>
Many I/O objects in Asio are stream-oriented. This means that:
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem">
There are no message boundaries. The data being transferred is a continuous
sequence of bytes.
</li>
<li class="listitem">
Read or write operations may transfer fewer bytes than requested. This
is referred to as a short read or short write.
</li>
</ul></div>
<p>
Objects that provide stream-oriented I/O model one or more of the following
type requirements:
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem">
<code class="computeroutput"><span class="identifier">SyncReadStream</span></code>, where
synchronous read operations are performed using a member function called
<code class="computeroutput"><span class="identifier">read_some</span><span class="special">()</span></code>.
</li>
<li class="listitem">
<code class="computeroutput"><span class="identifier">AsyncReadStream</span></code>, where
asynchronous read operations are performed using a member function
called <code class="computeroutput"><span class="identifier">async_read_some</span><span class="special">()</span></code>.
</li>
<li class="listitem">
<code class="computeroutput"><span class="identifier">SyncWriteStream</span></code>, where
synchronous write operations are performed using a member function
called <code class="computeroutput"><span class="identifier">write_some</span><span class="special">()</span></code>.
</li>
<li class="listitem">
<code class="computeroutput"><span class="identifier">AsyncWriteStream</span></code>, where
asynchronous write operations are performed using a member function
called <code class="computeroutput"><span class="identifier">async_write_some</span><span class="special">()</span></code>.
</li>
</ul></div>
<p>
Examples of stream-oriented I/O objects include <code class="computeroutput"><span class="identifier">ip</span><span class="special">::</span><span class="identifier">tcp</span><span class="special">::</span><span class="identifier">socket</span></code>,
<code class="computeroutput"><span class="identifier">ssl</span><span class="special">::</span><span class="identifier">stream</span><span class="special">&lt;&gt;</span></code>,
<code class="computeroutput"><span class="identifier">posix</span><span class="special">::</span><span class="identifier">stream_descriptor</span></code>, <code class="computeroutput"><span class="identifier">windows</span><span class="special">::</span><span class="identifier">stream_handle</span></code>,
etc.
</p>
<p>
Programs typically want to transfer an exact number of bytes. When a short
read or short write occurs the program must restart the operation, and
continue to do so until the required number of bytes has been transferred.
Asio provides generic functions that do this automatically: <code class="computeroutput"><span class="identifier">read</span><span class="special">()</span></code>,
<code class="computeroutput"><span class="identifier">async_read</span><span class="special">()</span></code>,
<code class="computeroutput"><span class="identifier">write</span><span class="special">()</span></code>
and <code class="computeroutput"><span class="identifier">async_write</span><span class="special">()</span></code>.
</p>
<h6>
<a name="asio.overview.core.streams.h0"></a>
<span><a name="asio.overview.core.streams.why_eof_is_an_error"></a></span><a class="link" href="streams.html#asio.overview.core.streams.why_eof_is_an_error">Why
EOF is an Error</a>
</h6>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem">
The end of a stream can cause <code class="computeroutput"><span class="identifier">read</span></code>,
<code class="computeroutput"><span class="identifier">async_read</span></code>, <code class="computeroutput"><span class="identifier">read_until</span></code> or <code class="computeroutput"><span class="identifier">async_read_until</span></code>
functions to violate their contract. E.g. a read of N bytes may finish
early due to EOF.
</li>
<li class="listitem">
An EOF error may be used to distinguish the end of a stream from a
successful read of size 0.
</li>
</ul></div>
<h6>
<a name="asio.overview.core.streams.h1"></a>
<span><a name="asio.overview.core.streams.see_also"></a></span><a class="link" href="streams.html#asio.overview.core.streams.see_also">See
Also</a>
</h6>
<p>
<a class="link" href="../../reference/async_read.html" title="async_read">async_read()</a>, <a class="link" href="../../reference/async_write.html" title="async_write">async_write()</a>,
<a class="link" href="../../reference/read.html" title="read">read()</a>, <a class="link" href="../../reference/write.html" title="write">write()</a>,
<a class="link" href="../../reference/AsyncReadStream.html" title="Buffer-oriented asynchronous read stream requirements">AsyncReadStream</a>,
<a class="link" href="../../reference/AsyncWriteStream.html" title="Buffer-oriented asynchronous write stream requirements">AsyncWriteStream</a>,
<a class="link" href="../../reference/SyncReadStream.html" title="Buffer-oriented synchronous read stream requirements">SyncReadStream</a>, <a class="link" href="../../reference/SyncWriteStream.html" title="Buffer-oriented synchronous write stream requirements">SyncWriteStream</a>.
</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-2020 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="buffers.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../core.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="reactor.html"><img src="../../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,124 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Threads and Asio</title>
<link rel="stylesheet" href="../../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../../index.html" title="Asio">
<link rel="up" href="../core.html" title="Core Concepts and Functionality">
<link rel="prev" href="async.html" title="The Proactor Design Pattern: Concurrency Without Threads">
<link rel="next" href="strands.html" title="Strands: Use Threads Without Explicit Locking">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="async.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../core.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="strands.html"><img src="../../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h4 class="title">
<a name="asio.overview.core.threads"></a><a class="link" href="threads.html" title="Threads and Asio">Threads and Asio</a>
</h4></div></div></div>
<h6>
<a name="asio.overview.core.threads.h0"></a>
<span><a name="asio.overview.core.threads.thread_safety"></a></span><a class="link" href="threads.html#asio.overview.core.threads.thread_safety">Thread
Safety</a>
</h6>
<p>
In general, it is safe to make concurrent use of distinct objects, but
unsafe to make concurrent use of a single object. However, types such as
<code class="computeroutput"><span class="identifier">io_context</span></code> provide a stronger
guarantee that it is safe to use a single object concurrently.
</p>
<h6>
<a name="asio.overview.core.threads.h1"></a>
<span><a name="asio.overview.core.threads.thread_pools"></a></span><a class="link" href="threads.html#asio.overview.core.threads.thread_pools">Thread
Pools</a>
</h6>
<p>
Multiple threads may call <code class="computeroutput"><span class="identifier">io_context</span><span class="special">::</span><span class="identifier">run</span><span class="special">()</span></code> to set up a pool of threads from which
completion handlers may be invoked. This approach may also be used with
<code class="computeroutput"><span class="identifier">post</span><span class="special">()</span></code>
as a means to perform arbitrary computational tasks across a thread pool.
</p>
<p>
Note that all threads that have joined an <code class="computeroutput"><span class="identifier">io_context</span></code>'s
pool are considered equivalent, and the <code class="computeroutput"><span class="identifier">io_context</span></code>
may distribute work across them in an arbitrary fashion.
</p>
<h6>
<a name="asio.overview.core.threads.h2"></a>
<span><a name="asio.overview.core.threads.internal_threads"></a></span><a class="link" href="threads.html#asio.overview.core.threads.internal_threads">Internal
Threads</a>
</h6>
<p>
The implementation of this library for a particular platform may make use
of one or more internal threads to emulate asynchronicity. As far as possible,
these threads must be invisible to the library user. In particular, the
threads:
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem">
must not call the user's code directly; and
</li>
<li class="listitem">
must block all signals.
</li>
</ul></div>
<p>
This approach is complemented by the following guarantee:
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
Asynchronous completion handlers will only be called from threads that
are currently calling <code class="computeroutput"><span class="identifier">io_context</span><span class="special">::</span><span class="identifier">run</span><span class="special">()</span></code>.
</li></ul></div>
<p>
Consequently, it is the library user's responsibility to create and manage
all threads to which the notifications will be delivered.
</p>
<p>
The reasons for this approach include:
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem">
By only calling <code class="computeroutput"><span class="identifier">io_context</span><span class="special">::</span><span class="identifier">run</span><span class="special">()</span></code> from a single thread, the user's
code can avoid the development complexity associated with synchronisation.
For example, a library user can implement scalable servers that are
single-threaded (from the user's point of view).
</li>
<li class="listitem">
A library user may need to perform initialisation in a thread shortly
after the thread starts and before any other application code is executed.
For example, users of Microsoft's COM must call <code class="computeroutput"><span class="identifier">CoInitializeEx</span></code>
before any other COM operations can be called from that thread.
</li>
<li class="listitem">
The library interface is decoupled from interfaces for thread creation
and management, and permits implementations on platforms where threads
are not available.
</li>
</ul></div>
<h6>
<a name="asio.overview.core.threads.h3"></a>
<span><a name="asio.overview.core.threads.see_also"></a></span><a class="link" href="threads.html#asio.overview.core.threads.see_also">See
Also</a>
</h6>
<p>
<a class="link" href="../../reference/io_context.html" title="io_context">io_context</a>, <a class="link" href="../../reference/post.html" title="post">post</a>.
</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-2020 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="async.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../core.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="strands.html"><img src="../../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,65 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>C++ 2011 Support</title>
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../index.html" title="Asio">
<link rel="up" href="../overview.html" title="Overview">
<link rel="prev" href="ssl.html" title="SSL">
<link rel="next" href="cpp2011/system_error.html" title="System Errors and Error Codes">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="ssl.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../overview.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="cpp2011/system_error.html"><img src="../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="asio.overview.cpp2011"></a><a class="link" href="cpp2011.html" title="C++ 2011 Support">C++ 2011 Support</a>
</h3></div></div></div>
<p>
<a class="link" href="cpp2011/system_error.html" title="System Errors and Error Codes">System Errors and Error
Codes</a>
</p>
<p>
<a class="link" href="cpp2011/move_objects.html" title="Movable I/O Objects">Movable I/O Objects</a>
</p>
<p>
<a class="link" href="cpp2011/move_handlers.html" title="Movable Handlers">Movable Handlers</a>
</p>
<p>
<a class="link" href="cpp2011/variadic.html" title="Variadic Templates">Variadic Templates</a>
</p>
<p>
<a class="link" href="cpp2011/array.html" title="Array Container">Array Container</a>
</p>
<p>
<a class="link" href="cpp2011/atomic.html" title="Atomics">Atomics</a>
</p>
<p>
<a class="link" href="cpp2011/shared_ptr.html" title="Shared Pointers">Shared Pointers</a>
</p>
<p>
<a class="link" href="cpp2011/chrono.html" title="Chrono">Chrono</a>
</p>
<p>
<a class="link" href="cpp2011/futures.html" title="Futures">Futures</a>
</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-2020 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="ssl.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../overview.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="cpp2011/system_error.html"><img src="../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,63 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Array Container</title>
<link rel="stylesheet" href="../../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../../index.html" title="Asio">
<link rel="up" href="../cpp2011.html" title="C++ 2011 Support">
<link rel="prev" href="variadic.html" title="Variadic Templates">
<link rel="next" href="atomic.html" title="Atomics">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="variadic.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../cpp2011.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="atomic.html"><img src="../../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h4 class="title">
<a name="asio.overview.cpp2011.array"></a><a class="link" href="array.html" title="Array Container">Array Container</a>
</h4></div></div></div>
<p>
Where the standard library provides <code class="computeroutput">std::array&lt;&gt;</code>, Asio:
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem">
Provides overloads for the <a class="link" href="../../reference/buffer.html" title="buffer">buffer()</a>
function.
</li>
<li class="listitem">
Uses it in preference to <code class="computeroutput">boost::array&lt;&gt;</code> for the
<a class="link" href="../../reference/ip__address_v4/bytes_type.html" title="ip::address_v4::bytes_type">ip::address_v4::bytes_type</a>
and <a class="link" href="../../reference/ip__address_v6/bytes_type.html" title="ip::address_v6::bytes_type">ip::address_v6::bytes_type</a>
types.
</li>
<li class="listitem">
Uses it in preference to <code class="computeroutput">boost::array&lt;&gt;</code> where a
fixed size array type is needed in the implementation.
</li>
</ul></div>
<p>
Support for <code class="computeroutput">std::array&lt;&gt;</code> is automatically enabled for
<code class="literal">g++</code> 4.3 and later, when the <code class="literal">-std=c++0x</code>
or <code class="literal">-std=gnu++0x</code> compiler options are used, as well as
for Microsoft Visual C++ 10. It may be disabled by defining <code class="computeroutput">ASIO_DISABLE_STD_ARRAY</code>,
or explicitly enabled for other compilers by defining <code class="computeroutput">ASIO_HAS_STD_ARRAY</code>.
</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-2020 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="variadic.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../cpp2011.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="atomic.html"><img src="../../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,48 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Atomics</title>
<link rel="stylesheet" href="../../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../../index.html" title="Asio">
<link rel="up" href="../cpp2011.html" title="C++ 2011 Support">
<link rel="prev" href="array.html" title="Array Container">
<link rel="next" href="shared_ptr.html" title="Shared Pointers">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="array.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../cpp2011.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="shared_ptr.html"><img src="../../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h4 class="title">
<a name="asio.overview.cpp2011.atomic"></a><a class="link" href="atomic.html" title="Atomics">Atomics</a>
</h4></div></div></div>
<p>
Asio's implementation can use <code class="computeroutput">std::atomic&lt;&gt;</code> in preference
to <code class="computeroutput">boost::detail::atomic_count</code>.
</p>
<p>
Support for the standard atomic integer template is automatically enabled
for <code class="literal">g++</code> 4.5 and later, when the <code class="literal">-std=c++0x</code>
or <code class="literal">-std=gnu++0x</code> compiler options are used. It may be
disabled by defining <code class="computeroutput">ASIO_DISABLE_STD_ATOMIC</code>, or explicitly
enabled for other compilers by defining <code class="computeroutput">ASIO_HAS_STD_ATOMIC</code>.
</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-2020 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="array.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../cpp2011.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="shared_ptr.html"><img src="../../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,59 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Chrono</title>
<link rel="stylesheet" href="../../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../../index.html" title="Asio">
<link rel="up" href="../cpp2011.html" title="C++ 2011 Support">
<link rel="prev" href="shared_ptr.html" title="Shared Pointers">
<link rel="next" href="futures.html" title="Futures">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="shared_ptr.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../cpp2011.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="futures.html"><img src="../../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h4 class="title">
<a name="asio.overview.cpp2011.chrono"></a><a class="link" href="chrono.html" title="Chrono">Chrono</a>
</h4></div></div></div>
<p>
Asio provides timers based on the <code class="computeroutput">std::chrono</code> facilities via
the <a class="link" href="../../reference/basic_waitable_timer.html" title="basic_waitable_timer">basic_waitable_timer</a>
class template. The typedefs <a class="link" href="../../reference/system_timer.html" title="system_timer">system_timer</a>,
<a class="link" href="../../reference/steady_timer.html" title="steady_timer">steady_timer</a> and <a class="link" href="../../reference/high_resolution_timer.html" title="high_resolution_timer">high_resolution_timer</a>
utilise the standard clocks <code class="computeroutput">system_clock</code>, <code class="computeroutput">steady_clock</code>
and <code class="computeroutput">high_resolution_clock</code> respectively.
</p>
<p>
Support for the <code class="computeroutput">std::chrono</code> facilities is automatically enabled
for <code class="literal">g++</code> 4.6 and later, when the <code class="literal">-std=c++0x</code>
or <code class="literal">-std=gnu++0x</code> compiler options are used. (Note that,
for <code class="literal">g++</code>, the draft-standard <code class="computeroutput">monotonic_clock</code>
is used in place of <code class="computeroutput">steady_clock</code>.) Support may be disabled
by defining <code class="computeroutput">ASIO_DISABLE_STD_CHRONO</code>, or explicitly enabled
for other compilers by defining <code class="computeroutput">ASIO_HAS_STD_CHRONO</code>.
</p>
<p>
When standard <code class="computeroutput">chrono</code> is unavailable, Asio will otherwise use
the Boost.Chrono library. The <a class="link" href="../../reference/basic_waitable_timer.html" title="basic_waitable_timer">basic_waitable_timer</a>
class template may be used with either.
</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-2020 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="shared_ptr.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../cpp2011.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="futures.html"><img src="../../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,75 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Futures</title>
<link rel="stylesheet" href="../../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../../index.html" title="Asio">
<link rel="up" href="../cpp2011.html" title="C++ 2011 Support">
<link rel="prev" href="chrono.html" title="Chrono">
<link rel="next" href="../implementation.html" title="Platform-Specific Implementation Notes">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="chrono.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../cpp2011.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="../implementation.html"><img src="../../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h4 class="title">
<a name="asio.overview.cpp2011.futures"></a><a class="link" href="futures.html" title="Futures">Futures</a>
</h4></div></div></div>
<p>
The <code class="computeroutput">asio::use_future</code> special value provides first-class support
for returning a C++11 <code class="computeroutput">std::future</code> from an asynchronous operation's
initiating function.
</p>
<p>
To use <code class="computeroutput">asio::use_future</code>, pass it to an asynchronous operation
instead of a normal completion handler. For example:
</p>
<pre class="programlisting">std::future&lt;std::size_t&gt; length =
my_socket.async_read_some(my_buffer, asio::use_future);
</pre>
<p>
Where a handler signature has the form:
</p>
<pre class="programlisting">void handler(asio::error_code ec, result_type result);
</pre>
<p>
the initiating function returns a <code class="computeroutput">std::future</code> templated on
<code class="computeroutput">result_type</code>. In the above example, this is <code class="computeroutput">std::size_t</code>.
If the asynchronous operation fails, the <code class="computeroutput">error_code</code> is converted
into a <code class="computeroutput">system_error</code> exception and passed back to the caller
through the future.
</p>
<p>
Where a handler signature has the form:
</p>
<pre class="programlisting">void handler(asio::error_code ec);
</pre>
<p>
the initiating function returns <code class="computeroutput">std::future&lt;void&gt;</code>. As
above, an error is passed back in the future as a <code class="computeroutput">system_error</code>
exception.
</p>
<p>
<a class="link" href="../../reference/use_future.html" title="use_future">use_future</a>, <a class="link" href="../../reference/use_future_t.html" title="use_future_t">use_future_t</a>,
<a class="link" href="../../examples/cpp11_examples.html#asio.examples.cpp11_examples.futures">Futures example (C++11)</a>.
</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-2020 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="chrono.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../cpp2011.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="../implementation.html"><img src="../../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,81 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Movable Handlers</title>
<link rel="stylesheet" href="../../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../../index.html" title="Asio">
<link rel="up" href="../cpp2011.html" title="C++ 2011 Support">
<link rel="prev" href="move_objects.html" title="Movable I/O Objects">
<link rel="next" href="variadic.html" title="Variadic Templates">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="move_objects.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../cpp2011.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="variadic.html"><img src="../../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h4 class="title">
<a name="asio.overview.cpp2011.move_handlers"></a><a class="link" href="move_handlers.html" title="Movable Handlers">Movable Handlers</a>
</h4></div></div></div>
<p>
With C++11 and later, user-defined completion handlers are only required
to be move constructible, and are not required to be copy constructible.
</p>
<p>
When move support is enabled, asynchronous that are documented as follows:
</p>
<pre class="programlisting">template &lt;typename Handler&gt;
void async_XYZ(..., Handler handler);
</pre>
<p>
are actually declared as:
</p>
<pre class="programlisting">template &lt;typename Handler&gt;
void async_XYZ(..., Handler&amp;&amp; handler);
</pre>
<p>
The handler argument is perfectly forwarded and the move construction occurs
within the body of <code class="computeroutput">async_XYZ()</code>. This ensures that all other
function arguments are evaluated prior to the move. This is critical when
the other arguments to <code class="computeroutput">async_XYZ()</code> are members of the handler.
For example:
</p>
<pre class="programlisting">struct my_operation
{
unique_ptr&lt;tcp::socket&gt; socket;
unique_ptr&lt;vector&lt;char&gt;&gt; buffer;
...
void operator(error_code ec, size_t length)
{
...
socket-&gt;async_read_some(asio::buffer(*buffer), std::move(*this));
...
}
};
</pre>
<p>
Move support is automatically enabled for <code class="literal">g++</code> 4.5 and
later, when the <code class="literal">-std=c++0x</code> or <code class="literal">-std=gnu++0x</code>
compiler options are used. It may be disabled by defining <code class="computeroutput">ASIO_DISABLE_MOVE</code>,
or explicitly enabled for other compilers by defining <code class="computeroutput">ASIO_HAS_MOVE</code>.
Note that these macros also affect the availability of <a class="link" href="move_objects.html" title="Movable I/O Objects">movable
I/O objects</a>.
</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-2020 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="move_objects.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../cpp2011.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="variadic.html"><img src="../../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,102 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Movable I/O Objects</title>
<link rel="stylesheet" href="../../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../../index.html" title="Asio">
<link rel="up" href="../cpp2011.html" title="C++ 2011 Support">
<link rel="prev" href="system_error.html" title="System Errors and Error Codes">
<link rel="next" href="move_handlers.html" title="Movable Handlers">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="system_error.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../cpp2011.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="move_handlers.html"><img src="../../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h4 class="title">
<a name="asio.overview.cpp2011.move_objects"></a><a class="link" href="move_objects.html" title="Movable I/O Objects">Movable I/O Objects</a>
</h4></div></div></div>
<p>
When move support is available (via rvalue references), Asio allows move
construction and assignment of sockets, serial ports, POSIX descriptors
and Windows handles.
</p>
<p>
Move support allows you to write code like:
</p>
<pre class="programlisting">tcp::socket make_socket(io_context&amp; i)
{
tcp::socket s(i);
...
std::move(s);
}
</pre>
<p>
or:
</p>
<pre class="programlisting">class connection : public enable_shared_from_this&lt;connection&gt;
{
private:
tcp::socket socket_;
...
public:
connection(tcp::socket&amp;&amp; s) : socket_(std::move(s)) {}
...
};
...
class server
{
private:
tcp::acceptor acceptor_;
...
void handle_accept(error_code ec, tcp::socket socket)
{
if (!ec)
std::make_shared&lt;connection&gt;(std::move(socket))-&gt;go();
acceptor_.async_accept(...);
}
...
};
</pre>
<p>
as well as:
</p>
<pre class="programlisting">std::vector&lt;tcp::socket&gt; sockets;
sockets.push_back(tcp::socket(...));
</pre>
<p>
A word of warning: There is nothing stopping you from moving these objects
while there are pending asynchronous operations, but it is unlikely to
be a good idea to do so. In particular, composed operations like <a class="link" href="../../reference/async_read.html" title="async_read">async_read()</a> store a reference
to the stream object. Moving during the composed operation means that the
composed operation may attempt to access a moved-from object.
</p>
<p>
Move support is automatically enabled for <code class="literal">g++</code> 4.5 and
later, when the <code class="literal">-std=c++0x</code> or <code class="literal">-std=gnu++0x</code>
compiler options are used. It may be disabled by defining <code class="computeroutput">ASIO_DISABLE_MOVE</code>,
or explicitly enabled for other compilers by defining <code class="computeroutput">ASIO_HAS_MOVE</code>.
Note that these macros also affect the availability of <a class="link" href="move_handlers.html" title="Movable Handlers">movable
handlers</a>.
</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-2020 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="system_error.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../cpp2011.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="move_handlers.html"><img src="../../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,48 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Shared Pointers</title>
<link rel="stylesheet" href="../../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../../index.html" title="Asio">
<link rel="up" href="../cpp2011.html" title="C++ 2011 Support">
<link rel="prev" href="atomic.html" title="Atomics">
<link rel="next" href="chrono.html" title="Chrono">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="atomic.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../cpp2011.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="chrono.html"><img src="../../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h4 class="title">
<a name="asio.overview.cpp2011.shared_ptr"></a><a class="link" href="shared_ptr.html" title="Shared Pointers">Shared Pointers</a>
</h4></div></div></div>
<p>
Asio's implementation can use <code class="computeroutput">std::shared_ptr&lt;&gt;</code> and
<code class="computeroutput">std::weak_ptr&lt;&gt;</code> in preference to the Boost equivalents.
</p>
<p>
Support for the standard smart pointers is automatically enabled for <code class="literal">g++</code>
4.3 and later, when the <code class="literal">-std=c++0x</code> or <code class="literal">-std=gnu++0x</code>
compiler options are used, as well as for Microsoft Visual C++ 10. It may
be disabled by defining <code class="computeroutput">ASIO_DISABLE_STD_SHARED_PTR</code>, or explicitly
enabled for other compilers by defining <code class="computeroutput">ASIO_HAS_STD_SHARED_PTR</code>.
</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-2020 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="atomic.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../cpp2011.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="chrono.html"><img src="../../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,50 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>System Errors and Error Codes</title>
<link rel="stylesheet" href="../../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../../index.html" title="Asio">
<link rel="up" href="../cpp2011.html" title="C++ 2011 Support">
<link rel="prev" href="../cpp2011.html" title="C++ 2011 Support">
<link rel="next" href="move_objects.html" title="Movable I/O Objects">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="../cpp2011.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../cpp2011.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="move_objects.html"><img src="../../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h4 class="title">
<a name="asio.overview.cpp2011.system_error"></a><a class="link" href="system_error.html" title="System Errors and Error Codes">System Errors and
Error Codes</a>
</h4></div></div></div>
<p>
When available, Asio can use the <code class="computeroutput">std::error_code</code> and <code class="computeroutput">std::system_error</code>
classes for reporting errors. In this case, the names <code class="computeroutput">asio::error_code</code>
and <code class="computeroutput">asio::system_error</code> will be typedefs for these standard
classes.
</p>
<p>
System error support is automatically enabled for <code class="literal">g++</code>
4.6 and later, when the <code class="literal">-std=c++0x</code> or <code class="literal">-std=gnu++0x</code>
compiler options are used. It may be disabled by defining <code class="computeroutput">ASIO_DISABLE_STD_SYSTEM_ERROR</code>,
or explicitly enabled for other compilers by defining <code class="computeroutput">ASIO_HAS_STD_SYSTEM_ERROR</code>.
</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-2020 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="../cpp2011.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../cpp2011.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="move_objects.html"><img src="../../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,49 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Variadic Templates</title>
<link rel="stylesheet" href="../../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../../index.html" title="Asio">
<link rel="up" href="../cpp2011.html" title="C++ 2011 Support">
<link rel="prev" href="move_handlers.html" title="Movable Handlers">
<link rel="next" href="array.html" title="Array Container">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="move_handlers.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../cpp2011.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="array.html"><img src="../../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h4 class="title">
<a name="asio.overview.cpp2011.variadic"></a><a class="link" href="variadic.html" title="Variadic Templates">Variadic Templates</a>
</h4></div></div></div>
<p>
When supported by a compiler, Asio can use variadic templates to implement
the <a class="link" href="../../reference/basic_socket_streambuf/connect.html" title="basic_socket_streambuf::connect">basic_socket_streambuf::connect()</a>
and <a class="link" href="../../reference/basic_socket_iostream/connect.html" title="basic_socket_iostream::connect">basic_socket_iostream::connect()</a>
functions.
</p>
<p>
Support for variadic templates is automatically enabled for <code class="literal">g++</code>
4.3 and later, when the <code class="literal">-std=c++0x</code> or <code class="literal">-std=gnu++0x</code>
compiler options are used. It may be disabled by defining <code class="computeroutput">ASIO_DISABLE_VARIADIC_TEMPLATES</code>,
or explicitly enabled for other compilers by defining <code class="computeroutput">ASIO_HAS_VARIADIC_TEMPLATES</code>.
</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-2020 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="move_handlers.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../cpp2011.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="array.html"><img src="../../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,491 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Platform-Specific Implementation Notes</title>
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../index.html" title="Asio">
<link rel="up" href="../overview.html" title="Overview">
<link rel="prev" href="cpp2011/futures.html" title="Futures">
<link rel="next" href="../using.html" title="Using Asio">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="cpp2011/futures.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../overview.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="../using.html"><img src="../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="asio.overview.implementation"></a><a class="link" href="implementation.html" title="Platform-Specific Implementation Notes">Platform-Specific Implementation
Notes</a>
</h3></div></div></div>
<p>
This section lists platform-specific implementation details, such as the
default demultiplexing mechanism, the number of threads created internally,
and when threads are created.
</p>
<h5>
<a name="asio.overview.implementation.h0"></a>
<span><a name="asio.overview.implementation.linux_kernel_2_4"></a></span><a class="link" href="implementation.html#asio.overview.implementation.linux_kernel_2_4">Linux
Kernel 2.4</a>
</h5>
<p>
Demultiplexing mechanism:
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
Uses <code class="computeroutput">select</code> for demultiplexing. This means that the number
of file descriptors in the process cannot be permitted to exceed <code class="computeroutput">FD_SETSIZE</code>.
</li></ul></div>
<p>
Threads:
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem">
Demultiplexing using <code class="computeroutput">select</code> is performed in one of the threads
that calls <code class="computeroutput">io_context::run()</code>, <code class="computeroutput">io_context::run_one()</code>,
<code class="computeroutput">io_context::poll()</code> or <code class="computeroutput">io_context::poll_one()</code>.
</li>
<li class="listitem">
An additional thread per <code class="computeroutput">io_context</code> is used to emulate asynchronous
host resolution. This thread is created on the first call to either
<code class="computeroutput">ip::tcp::resolver::async_resolve()</code> or <code class="computeroutput">ip::udp::resolver::async_resolve()</code>.
</li>
</ul></div>
<p>
Scatter-Gather:
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
At most <code class="computeroutput">min(64,IOV_MAX)</code> buffers may be transferred in a
single operation.
</li></ul></div>
<h5>
<a name="asio.overview.implementation.h1"></a>
<span><a name="asio.overview.implementation.linux_kernel_2_6"></a></span><a class="link" href="implementation.html#asio.overview.implementation.linux_kernel_2_6">Linux
Kernel 2.6</a>
</h5>
<p>
Demultiplexing mechanism:
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
Uses <code class="computeroutput">epoll</code> for demultiplexing.
</li></ul></div>
<p>
Threads:
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem">
Demultiplexing using <code class="computeroutput">epoll</code> is performed in one of the threads
that calls <code class="computeroutput">io_context::run()</code>, <code class="computeroutput">io_context::run_one()</code>,
<code class="computeroutput">io_context::poll()</code> or <code class="computeroutput">io_context::poll_one()</code>.
</li>
<li class="listitem">
An additional thread per <code class="computeroutput">io_context</code> is used to emulate asynchronous
host resolution. This thread is created on the first call to either
<code class="computeroutput">ip::tcp::resolver::async_resolve()</code> or <code class="computeroutput">ip::udp::resolver::async_resolve()</code>.
</li>
</ul></div>
<p>
Scatter-Gather:
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
At most <code class="computeroutput">min(64,IOV_MAX)</code> buffers may be transferred in a
single operation.
</li></ul></div>
<h5>
<a name="asio.overview.implementation.h2"></a>
<span><a name="asio.overview.implementation.solaris"></a></span><a class="link" href="implementation.html#asio.overview.implementation.solaris">Solaris</a>
</h5>
<p>
Demultiplexing mechanism:
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
Uses <code class="literal">/dev/poll</code> for demultiplexing.
</li></ul></div>
<p>
Threads:
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem">
Demultiplexing using <code class="literal">/dev/poll</code> is performed in one
of the threads that calls <code class="computeroutput">io_context::run()</code>, <code class="computeroutput">io_context::run_one()</code>,
<code class="computeroutput">io_context::poll()</code> or <code class="computeroutput">io_context::poll_one()</code>.
</li>
<li class="listitem">
An additional thread per <code class="computeroutput">io_context</code> is used to emulate asynchronous
host resolution. This thread is created on the first call to either
<code class="computeroutput">ip::tcp::resolver::async_resolve()</code> or <code class="computeroutput">ip::udp::resolver::async_resolve()</code>.
</li>
</ul></div>
<p>
Scatter-Gather:
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
At most <code class="computeroutput">min(64,IOV_MAX)</code> buffers may be transferred in a
single operation.
</li></ul></div>
<h5>
<a name="asio.overview.implementation.h3"></a>
<span><a name="asio.overview.implementation.qnx_neutrino"></a></span><a class="link" href="implementation.html#asio.overview.implementation.qnx_neutrino">QNX
Neutrino</a>
</h5>
<p>
Demultiplexing mechanism:
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
Uses <code class="computeroutput">select</code> for demultiplexing. This means that the number
of file descriptors in the process cannot be permitted to exceed <code class="computeroutput">FD_SETSIZE</code>.
</li></ul></div>
<p>
Threads:
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem">
Demultiplexing using <code class="computeroutput">select</code> is performed in one of the threads
that calls <code class="computeroutput">io_context::run()</code>, <code class="computeroutput">io_context::run_one()</code>,
<code class="computeroutput">io_context::poll()</code> or <code class="computeroutput">io_context::poll_one()</code>.
</li>
<li class="listitem">
An additional thread per <code class="computeroutput">io_context</code> is used to emulate asynchronous
host resolution. This thread is created on the first call to either
<code class="computeroutput">ip::tcp::resolver::async_resolve()</code> or <code class="computeroutput">ip::udp::resolver::async_resolve()</code>.
</li>
</ul></div>
<p>
Scatter-Gather:
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
At most <code class="computeroutput">min(64,IOV_MAX)</code> buffers may be transferred in a
single operation.
</li></ul></div>
<h5>
<a name="asio.overview.implementation.h4"></a>
<span><a name="asio.overview.implementation.mac_os_x"></a></span><a class="link" href="implementation.html#asio.overview.implementation.mac_os_x">Mac
OS X</a>
</h5>
<p>
Demultiplexing mechanism:
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
Uses <code class="computeroutput">kqueue</code> for demultiplexing.
</li></ul></div>
<p>
Threads:
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem">
Demultiplexing using <code class="computeroutput">kqueue</code> is performed in one of the threads
that calls <code class="computeroutput">io_context::run()</code>, <code class="computeroutput">io_context::run_one()</code>,
<code class="computeroutput">io_context::poll()</code> or <code class="computeroutput">io_context::poll_one()</code>.
</li>
<li class="listitem">
An additional thread per <code class="computeroutput">io_context</code> is used to emulate asynchronous
host resolution. This thread is created on the first call to either
<code class="computeroutput">ip::tcp::resolver::async_resolve()</code> or <code class="computeroutput">ip::udp::resolver::async_resolve()</code>.
</li>
</ul></div>
<p>
Scatter-Gather:
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
At most <code class="computeroutput">min(64,IOV_MAX)</code> buffers may be transferred in a
single operation.
</li></ul></div>
<h5>
<a name="asio.overview.implementation.h5"></a>
<span><a name="asio.overview.implementation.freebsd"></a></span><a class="link" href="implementation.html#asio.overview.implementation.freebsd">FreeBSD</a>
</h5>
<p>
Demultiplexing mechanism:
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
Uses <code class="computeroutput">kqueue</code> for demultiplexing.
</li></ul></div>
<p>
Threads:
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem">
Demultiplexing using <code class="computeroutput">kqueue</code> is performed in one of the threads
that calls <code class="computeroutput">io_context::run()</code>, <code class="computeroutput">io_context::run_one()</code>,
<code class="computeroutput">io_context::poll()</code> or <code class="computeroutput">io_context::poll_one()</code>.
</li>
<li class="listitem">
An additional thread per <code class="computeroutput">io_context</code> is used to emulate asynchronous
host resolution. This thread is created on the first call to either
<code class="computeroutput">ip::tcp::resolver::async_resolve()</code> or <code class="computeroutput">ip::udp::resolver::async_resolve()</code>.
</li>
</ul></div>
<p>
Scatter-Gather:
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
At most <code class="computeroutput">min(64,IOV_MAX)</code> buffers may be transferred in a
single operation.
</li></ul></div>
<h5>
<a name="asio.overview.implementation.h6"></a>
<span><a name="asio.overview.implementation.aix"></a></span><a class="link" href="implementation.html#asio.overview.implementation.aix">AIX</a>
</h5>
<p>
Demultiplexing mechanism:
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
Uses <code class="computeroutput">select</code> for demultiplexing. This means that the number
of file descriptors in the process cannot be permitted to exceed <code class="computeroutput">FD_SETSIZE</code>.
</li></ul></div>
<p>
Threads:
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem">
Demultiplexing using <code class="computeroutput">select</code> is performed in one of the threads
that calls <code class="computeroutput">io_context::run()</code>, <code class="computeroutput">io_context::run_one()</code>,
<code class="computeroutput">io_context::poll()</code> or <code class="computeroutput">io_context::poll_one()</code>.
</li>
<li class="listitem">
An additional thread per <code class="computeroutput">io_context</code> is used to emulate asynchronous
host resolution. This thread is created on the first call to either
<code class="computeroutput">ip::tcp::resolver::async_resolve()</code> or <code class="computeroutput">ip::udp::resolver::async_resolve()</code>.
</li>
</ul></div>
<p>
Scatter-Gather:
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
At most <code class="computeroutput">min(64,IOV_MAX)</code> buffers may be transferred in a
single operation.
</li></ul></div>
<h5>
<a name="asio.overview.implementation.h7"></a>
<span><a name="asio.overview.implementation.hp_ux"></a></span><a class="link" href="implementation.html#asio.overview.implementation.hp_ux">HP-UX</a>
</h5>
<p>
Demultiplexing mechanism:
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
Uses <code class="computeroutput">select</code> for demultiplexing. This means that the number
of file descriptors in the process cannot be permitted to exceed <code class="computeroutput">FD_SETSIZE</code>.
</li></ul></div>
<p>
Threads:
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem">
Demultiplexing using <code class="computeroutput">select</code> is performed in one of the threads
that calls <code class="computeroutput">io_context::run()</code>, <code class="computeroutput">io_context::run_one()</code>,
<code class="computeroutput">io_context::poll()</code> or <code class="computeroutput">io_context::poll_one()</code>.
</li>
<li class="listitem">
An additional thread per <code class="computeroutput">io_context</code> is used to emulate asynchronous
host resolution. This thread is created on the first call to either
<code class="computeroutput">ip::tcp::resolver::async_resolve()</code> or <code class="computeroutput">ip::udp::resolver::async_resolve()</code>.
</li>
</ul></div>
<p>
Scatter-Gather:
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
At most <code class="computeroutput">min(64,IOV_MAX)</code> buffers may be transferred in a
single operation.
</li></ul></div>
<h5>
<a name="asio.overview.implementation.h8"></a>
<span><a name="asio.overview.implementation.tru64"></a></span><a class="link" href="implementation.html#asio.overview.implementation.tru64">Tru64</a>
</h5>
<p>
Demultiplexing mechanism:
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
Uses <code class="computeroutput">select</code> for demultiplexing. This means that the number
of file descriptors in the process cannot be permitted to exceed <code class="computeroutput">FD_SETSIZE</code>.
</li></ul></div>
<p>
Threads:
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem">
Demultiplexing using <code class="computeroutput">select</code> is performed in one of the threads
that calls <code class="computeroutput">io_context::run()</code>, <code class="computeroutput">io_context::run_one()</code>,
<code class="computeroutput">io_context::poll()</code> or <code class="computeroutput">io_context::poll_one()</code>.
</li>
<li class="listitem">
An additional thread per <code class="computeroutput">io_context</code> is used to emulate asynchronous
host resolution. This thread is created on the first call to either
<code class="computeroutput">ip::tcp::resolver::async_resolve()</code> or <code class="computeroutput">ip::udp::resolver::async_resolve()</code>.
</li>
</ul></div>
<p>
Scatter-Gather:
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
At most <code class="computeroutput">min(64,IOV_MAX)</code> buffers may be transferred in a
single operation.
</li></ul></div>
<h5>
<a name="asio.overview.implementation.h9"></a>
<span><a name="asio.overview.implementation.windows_95__98_and_me"></a></span><a class="link" href="implementation.html#asio.overview.implementation.windows_95__98_and_me">Windows
95, 98 and Me</a>
</h5>
<p>
Demultiplexing mechanism:
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
Uses <code class="computeroutput">select</code> for demultiplexing.
</li></ul></div>
<p>
Threads:
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem">
Demultiplexing using <code class="computeroutput">select</code> is performed in one of the threads
that calls <code class="computeroutput">io_context::run()</code>, <code class="computeroutput">io_context::run_one()</code>,
<code class="computeroutput">io_context::poll()</code> or <code class="computeroutput">io_context::poll_one()</code>.
</li>
<li class="listitem">
An additional thread per <code class="computeroutput">io_context</code> is used to emulate asynchronous
host resolution. This thread is created on the first call to either
<code class="computeroutput">ip::tcp::resolver::async_resolve()</code> or <code class="computeroutput">ip::udp::resolver::async_resolve()</code>.
</li>
</ul></div>
<p>
Scatter-Gather:
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
For sockets, at most 16 buffers may be transferred in a single operation.
</li></ul></div>
<h5>
<a name="asio.overview.implementation.h10"></a>
<span><a name="asio.overview.implementation.windows_nt__2000__xp__2003__vista__7_and_8"></a></span><a class="link" href="implementation.html#asio.overview.implementation.windows_nt__2000__xp__2003__vista__7_and_8">Windows
NT, 2000, XP, 2003, Vista, 7 and 8</a>
</h5>
<p>
Demultiplexing mechanism:
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem">
Uses overlapped I/O and I/O completion ports for all asynchronous socket
operations except for asynchronous connect.
</li>
<li class="listitem">
Uses <code class="computeroutput">select</code> for emulating asynchronous connect.
</li>
</ul></div>
<p>
Threads:
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem">
Demultiplexing using I/O completion ports is performed in all threads
that call <code class="computeroutput">io_context::run()</code>, <code class="computeroutput">io_context::run_one()</code>,
<code class="computeroutput">io_context::poll()</code> or <code class="computeroutput">io_context::poll_one()</code>.
</li>
<li class="listitem">
An additional thread per <code class="computeroutput">io_context</code> is used to trigger timers.
This thread is created on construction of the first <code class="computeroutput">basic_deadline_timer</code>
or <code class="computeroutput">basic_waitable_timer</code> objects.
</li>
<li class="listitem">
An additional thread per <code class="computeroutput">io_context</code> is used for the <code class="computeroutput">select</code>
demultiplexing. This thread is created on the first call to <code class="computeroutput">async_connect()</code>.
</li>
<li class="listitem">
An additional thread per <code class="computeroutput">io_context</code> is used to emulate asynchronous
host resolution. This thread is created on the first call to either
<code class="computeroutput">ip::tcp::resolver::async_resolve()</code> or <code class="computeroutput">ip::udp::resolver::async_resolve()</code>.
</li>
</ul></div>
<p>
Scatter-Gather:
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem">
For sockets, at most 64 buffers may be transferred in a single operation.
</li>
<li class="listitem">
For stream-oriented handles, only one buffer may be transferred in a
single operation.
</li>
</ul></div>
<h5>
<a name="asio.overview.implementation.h11"></a>
<span><a name="asio.overview.implementation.windows_runtime"></a></span><a class="link" href="implementation.html#asio.overview.implementation.windows_runtime">Windows
Runtime</a>
</h5>
<p>
Asio provides limited support for the Windows Runtime. It requires that the
language extensions be enabled. Due to the restricted facilities exposed
by the Windows Runtime API, the support comes with the following caveats:
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem">
The core facilities such as the <code class="computeroutput">io_context</code>, <code class="computeroutput">strand</code>,
buffers, composed operations, timers, etc., should all work as normal.
</li>
<li class="listitem">
For sockets, only client-side TCP is supported.
</li>
<li class="listitem">
Explicit binding of a client-side TCP socket is not supported.
</li>
<li class="listitem">
The <code class="computeroutput">cancel()</code> function is not supported for sockets. Asynchronous
operations may only be cancelled by closing the socket.
</li>
<li class="listitem">
Operations that use <code class="computeroutput">null_buffers</code> are not supported.
</li>
<li class="listitem">
Only <code class="computeroutput">tcp::no_delay</code> and <code class="computeroutput">socket_base::keep_alive</code>
options are supported.
</li>
<li class="listitem">
Resolvers do not support service names, only numbers. I.e. you must use
"80" rather than "http".
</li>
<li class="listitem">
Most resolver query flags have no effect.
</li>
</ul></div>
<p>
Demultiplexing mechanism:
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
Uses the <code class="computeroutput">Windows::Networking::Sockets::StreamSocket</code> class
to implement asynchronous TCP socket operations.
</li></ul></div>
<p>
Threads:
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem">
Event completions are delivered to the Windows thread pool and posted
to the <code class="computeroutput">io_context</code> for the handler to be executed.
</li>
<li class="listitem">
An additional thread per <code class="computeroutput">io_context</code> is used to trigger timers.
This thread is created on construction of the first timer objects.
</li>
</ul></div>
<p>
Scatter-Gather:
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
For sockets, at most one buffer may be transferred in a single operation.
</li></ul></div>
</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-2020 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="cpp2011/futures.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../overview.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="../using.html"><img src="../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,53 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Networking</title>
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../index.html" title="Asio">
<link rel="up" href="../overview.html" title="Overview">
<link rel="prev" href="core/coroutines_ts.html" title="Coroutines TS Support">
<link rel="next" href="networking/protocols.html" title="TCP, UDP and ICMP">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="core/coroutines_ts.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../overview.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="networking/protocols.html"><img src="../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="asio.overview.networking"></a><a class="link" href="networking.html" title="Networking">Networking</a>
</h3></div></div></div>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem">
<a class="link" href="networking/protocols.html" title="TCP, UDP and ICMP">TCP, UDP and ICMP</a>
</li>
<li class="listitem">
<a class="link" href="networking/other_protocols.html" title="Support for Other Protocols">Support for
Other Protocols</a>
</li>
<li class="listitem">
<a class="link" href="networking/iostreams.html" title="Socket Iostreams">Socket Iostreams</a>
</li>
<li class="listitem">
<a class="link" href="networking/bsd_sockets.html" title="The BSD Socket API and Asio">The BSD Socket API
and Asio</a>
</li>
</ul></div>
</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-2020 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/coroutines_ts.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../overview.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="networking/protocols.html"><img src="../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,546 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>The BSD Socket API and Asio</title>
<link rel="stylesheet" href="../../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../../index.html" title="Asio">
<link rel="up" href="../networking.html" title="Networking">
<link rel="prev" href="iostreams.html" title="Socket Iostreams">
<link rel="next" href="../timers.html" title="Timers">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="iostreams.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../networking.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="../timers.html"><img src="../../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h4 class="title">
<a name="asio.overview.networking.bsd_sockets"></a><a class="link" href="bsd_sockets.html" title="The BSD Socket API and Asio">The BSD Socket
API and Asio</a>
</h4></div></div></div>
<p>
The Asio library includes a low-level socket interface based on the BSD
socket API, which is widely implemented and supported by extensive literature.
It is also used as the basis for networking APIs in other languages, like
Java. This low-level interface is designed to support the development of
efficient and scalable applications. For example, it permits programmers
to exert finer control over the number of system calls, avoid redundant
data copying, minimise the use of resources like threads, and so on.
</p>
<p>
Unsafe and error prone aspects of the BSD socket API are not included.
For example, the use of <code class="computeroutput">int</code> to represent all sockets lacks
type safety. The socket representation in Asio uses a distinct type for
each protocol, e.g. for TCP one would use <code class="computeroutput">ip::tcp::socket</code>,
and for UDP one uses <code class="computeroutput">ip::udp::socket</code>.
</p>
<p>
The following table shows the mapping between the BSD socket API and Asio:
</p>
<div class="informaltable"><table class="table">
<colgroup>
<col>
<col>
</colgroup>
<thead><tr>
<th>
<p>
BSD Socket API Elements
</p>
</th>
<th>
<p>
Equivalents in Asio
</p>
</th>
</tr></thead>
<tbody>
<tr>
<td>
<p>
socket descriptor - <code class="computeroutput">int</code> (POSIX) or <code class="computeroutput">SOCKET</code>
(Windows)
</p>
</td>
<td>
<p>
For TCP: <a class="link" href="../../reference/ip__tcp/socket.html" title="ip::tcp::socket">ip::tcp::socket</a>,
<a class="link" href="../../reference/ip__tcp/acceptor.html" title="ip::tcp::acceptor">ip::tcp::acceptor</a>
</p>
<p>
For UDP: <a class="link" href="../../reference/ip__udp/socket.html" title="ip::udp::socket">ip::udp::socket</a>
</p>
<p>
<a class="link" href="../../reference/basic_socket.html" title="basic_socket">basic_socket</a>,
<a class="link" href="../../reference/basic_stream_socket.html" title="basic_stream_socket">basic_stream_socket</a>,
<a class="link" href="../../reference/basic_datagram_socket.html" title="basic_datagram_socket">basic_datagram_socket</a>,
<a class="link" href="../../reference/basic_raw_socket.html" title="basic_raw_socket">basic_raw_socket</a>
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">in_addr</code>, <code class="computeroutput">in6_addr</code>
</p>
</td>
<td>
<p>
<a class="link" href="../../reference/ip__address.html" title="ip::address">ip::address</a>,
<a class="link" href="../../reference/ip__address.html" title="ip::address">ip::address_v4</a>,
<a class="link" href="../../reference/ip__address.html" title="ip::address">ip::address_v6</a>
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">sockaddr_in</code>, <code class="computeroutput">sockaddr_in6</code>
</p>
</td>
<td>
<p>
For TCP: <a class="link" href="../../reference/ip__tcp/endpoint.html" title="ip::tcp::endpoint">ip::tcp::endpoint</a>
</p>
<p>
For UDP: <a class="link" href="../../reference/ip__udp/endpoint.html" title="ip::udp::endpoint">ip::udp::endpoint</a>
</p>
<p>
<a class="link" href="../../reference/ip__basic_endpoint.html" title="ip::basic_endpoint">ip::basic_endpoint</a>
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">accept()</code>
</p>
</td>
<td>
<p>
For TCP: <a class="link" href="../../reference/basic_socket_acceptor/accept.html" title="basic_socket_acceptor::accept">ip::tcp::acceptor::accept()</a>
</p>
<p>
<a class="link" href="../../reference/basic_socket_acceptor/accept.html" title="basic_socket_acceptor::accept">basic_socket_acceptor::accept()</a>
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">bind()</code>
</p>
</td>
<td>
<p>
For TCP: <a class="link" href="../../reference/basic_socket/bind.html" title="basic_socket::bind">ip::tcp::acceptor::bind()</a>,
<a class="link" href="../../reference/basic_socket/bind.html" title="basic_socket::bind">ip::tcp::socket::bind()</a>
</p>
<p>
For UDP: <a class="link" href="../../reference/basic_socket/bind.html" title="basic_socket::bind">ip::udp::socket::bind()</a>
</p>
<p>
<a class="link" href="../../reference/basic_socket/bind.html" title="basic_socket::bind">basic_socket::bind()</a>
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">close()</code>
</p>
</td>
<td>
<p>
For TCP: <a class="link" href="../../reference/basic_socket/close.html" title="basic_socket::close">ip::tcp::acceptor::close()</a>,
<a class="link" href="../../reference/basic_socket/close.html" title="basic_socket::close">ip::tcp::socket::close()</a>
</p>
<p>
For UDP: <a class="link" href="../../reference/basic_socket/close.html" title="basic_socket::close">ip::udp::socket::close()</a>
</p>
<p>
<a class="link" href="../../reference/basic_socket/close.html" title="basic_socket::close">basic_socket::close()</a>
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">connect()</code>
</p>
</td>
<td>
<p>
For TCP: <a class="link" href="../../reference/basic_socket/connect.html" title="basic_socket::connect">ip::tcp::socket::connect()</a>
</p>
<p>
For UDP: <a class="link" href="../../reference/basic_socket/connect.html" title="basic_socket::connect">ip::udp::socket::connect()</a>
</p>
<p>
<a class="link" href="../../reference/basic_socket/connect.html" title="basic_socket::connect">basic_socket::connect()</a>
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">getaddrinfo()</code>, <code class="computeroutput">gethostbyaddr()</code>, <code class="computeroutput">gethostbyname()</code>,
<code class="computeroutput">getnameinfo()</code>, <code class="computeroutput">getservbyname()</code>, <code class="computeroutput">getservbyport()</code>
</p>
</td>
<td>
<p>
For TCP: <a class="link" href="../../reference/ip__basic_resolver/resolve.html" title="ip::basic_resolver::resolve">ip::tcp::resolver::resolve()</a>,
<a class="link" href="../../reference/ip__basic_resolver/async_resolve.html" title="ip::basic_resolver::async_resolve">ip::tcp::resolver::async_resolve()</a>
</p>
<p>
For UDP: <a class="link" href="../../reference/ip__basic_resolver/resolve.html" title="ip::basic_resolver::resolve">ip::udp::resolver::resolve()</a>,
<a class="link" href="../../reference/ip__basic_resolver/async_resolve.html" title="ip::basic_resolver::async_resolve">ip::udp::resolver::async_resolve()</a>
</p>
<p>
<a class="link" href="../../reference/ip__basic_resolver/resolve.html" title="ip::basic_resolver::resolve">ip::basic_resolver::resolve()</a>,
<a class="link" href="../../reference/ip__basic_resolver/async_resolve.html" title="ip::basic_resolver::async_resolve">ip::basic_resolver::async_resolve()</a>
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">gethostname()</code>
</p>
</td>
<td>
<p>
<a class="link" href="../../reference/ip__host_name.html" title="ip::host_name">ip::host_name()</a>
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">getpeername()</code>
</p>
</td>
<td>
<p>
For TCP: <a class="link" href="../../reference/basic_socket/remote_endpoint.html" title="basic_socket::remote_endpoint">ip::tcp::socket::remote_endpoint()</a>
</p>
<p>
For UDP: <a class="link" href="../../reference/basic_socket/remote_endpoint.html" title="basic_socket::remote_endpoint">ip::udp::socket::remote_endpoint()</a>
</p>
<p>
<a class="link" href="../../reference/basic_socket/remote_endpoint.html" title="basic_socket::remote_endpoint">basic_socket::remote_endpoint()</a>
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">getsockname()</code>
</p>
</td>
<td>
<p>
For TCP: <a class="link" href="../../reference/basic_socket/local_endpoint.html" title="basic_socket::local_endpoint">ip::tcp::acceptor::local_endpoint()</a>,
<a class="link" href="../../reference/basic_socket/local_endpoint.html" title="basic_socket::local_endpoint">ip::tcp::socket::local_endpoint()</a>
</p>
<p>
For UDP: <a class="link" href="../../reference/basic_socket/local_endpoint.html" title="basic_socket::local_endpoint">ip::udp::socket::local_endpoint()</a>
</p>
<p>
<a class="link" href="../../reference/basic_socket/local_endpoint.html" title="basic_socket::local_endpoint">basic_socket::local_endpoint()</a>
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">getsockopt()</code>
</p>
</td>
<td>
<p>
For TCP: <a class="link" href="../../reference/basic_socket/get_option.html" title="basic_socket::get_option">ip::tcp::acceptor::get_option()</a>,
<a class="link" href="../../reference/basic_socket/get_option.html" title="basic_socket::get_option">ip::tcp::socket::get_option()</a>
</p>
<p>
For UDP: <a class="link" href="../../reference/basic_socket/get_option.html" title="basic_socket::get_option">ip::udp::socket::get_option()</a>
</p>
<p>
<a class="link" href="../../reference/basic_socket/get_option.html" title="basic_socket::get_option">basic_socket::get_option()</a>
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">inet_addr()</code>, <code class="computeroutput">inet_aton()</code>, <code class="computeroutput">inet_pton()</code>
</p>
</td>
<td>
<p>
<a class="link" href="../../reference/ip__address/from_string.html" title="ip::address::from_string">ip::address::from_string()</a>,
<a class="link" href="../../reference/ip__address/from_string.html" title="ip::address::from_string">ip::address_v4::from_string()</a>,
<a class="link" href="../../reference/ip__address/from_string.html" title="ip::address::from_string">ip_address_v6::from_string()</a>
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">inet_ntoa()</code>, <code class="computeroutput">inet_ntop()</code>
</p>
</td>
<td>
<p>
<a class="link" href="../../reference/ip__address/to_string.html" title="ip::address::to_string">ip::address::to_string()</a>,
<a class="link" href="../../reference/ip__address/to_string.html" title="ip::address::to_string">ip::address_v4::to_string()</a>,
<a class="link" href="../../reference/ip__address/to_string.html" title="ip::address::to_string">ip_address_v6::to_string()</a>
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">ioctl()</code>
</p>
</td>
<td>
<p>
For TCP: <a class="link" href="../../reference/basic_socket/io_control.html" title="basic_socket::io_control">ip::tcp::socket::io_control()</a>
</p>
<p>
For UDP: <a class="link" href="../../reference/basic_socket/io_control.html" title="basic_socket::io_control">ip::udp::socket::io_control()</a>
</p>
<p>
<a class="link" href="../../reference/basic_socket/io_control.html" title="basic_socket::io_control">basic_socket::io_control()</a>
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">listen()</code>
</p>
</td>
<td>
<p>
For TCP: <a class="link" href="../../reference/basic_socket_acceptor/listen.html" title="basic_socket_acceptor::listen">ip::tcp::acceptor::listen()</a>
</p>
<p>
<a class="link" href="../../reference/basic_socket_acceptor/listen.html" title="basic_socket_acceptor::listen">basic_socket_acceptor::listen()</a>
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">poll()</code>, <code class="computeroutput">select()</code>, <code class="computeroutput">pselect()</code>
</p>
</td>
<td>
<p>
<a class="link" href="../../reference/io_context/run.html" title="io_context::run">io_context::run()</a>,
<a class="link" href="../../reference/io_context/run_one.html" title="io_context::run_one">io_context::run_one()</a>,
<a class="link" href="../../reference/io_context/poll.html" title="io_context::poll">io_context::poll()</a>,
<a class="link" href="../../reference/io_context/poll_one.html" title="io_context::poll_one">io_context::poll_one()</a>
</p>
<p>
Note: in conjunction with asynchronous operations.
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">readv()</code>, <code class="computeroutput">recv()</code>, <code class="computeroutput">read()</code>
</p>
</td>
<td>
<p>
For TCP: <a class="link" href="../../reference/basic_stream_socket/read_some.html" title="basic_stream_socket::read_some">ip::tcp::socket::read_some()</a>,
<a class="link" href="../../reference/basic_stream_socket/async_read_some.html" title="basic_stream_socket::async_read_some">ip::tcp::socket::async_read_some()</a>,
<a class="link" href="../../reference/basic_stream_socket/receive.html" title="basic_stream_socket::receive">ip::tcp::socket::receive()</a>,
<a class="link" href="../../reference/basic_stream_socket/async_receive.html" title="basic_stream_socket::async_receive">ip::tcp::socket::async_receive()</a>
</p>
<p>
For UDP: <a class="link" href="../../reference/basic_datagram_socket/receive.html" title="basic_datagram_socket::receive">ip::udp::socket::receive()</a>,
<a class="link" href="../../reference/basic_datagram_socket/async_receive.html" title="basic_datagram_socket::async_receive">ip::udp::socket::async_receive()</a>
</p>
<p>
<a class="link" href="../../reference/basic_stream_socket/read_some.html" title="basic_stream_socket::read_some">basic_stream_socket::read_some()</a>,
<a class="link" href="../../reference/basic_stream_socket/async_read_some.html" title="basic_stream_socket::async_read_some">basic_stream_socket::async_read_some()</a>,
<a class="link" href="../../reference/basic_stream_socket/receive.html" title="basic_stream_socket::receive">basic_stream_socket::receive()</a>,
<a class="link" href="../../reference/basic_stream_socket/async_receive.html" title="basic_stream_socket::async_receive">basic_stream_socket::async_receive()</a>,
<a class="link" href="../../reference/basic_datagram_socket/receive.html" title="basic_datagram_socket::receive">basic_datagram_socket::receive()</a>,
<a class="link" href="../../reference/basic_datagram_socket/async_receive.html" title="basic_datagram_socket::async_receive">basic_datagram_socket::async_receive()</a>
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">recvfrom()</code>
</p>
</td>
<td>
<p>
For UDP: <a class="link" href="../../reference/basic_datagram_socket/receive_from.html" title="basic_datagram_socket::receive_from">ip::udp::socket::receive_from()</a>,
<a class="link" href="../../reference/basic_datagram_socket/async_receive_from.html" title="basic_datagram_socket::async_receive_from">ip::udp::socket::async_receive_from()</a>
</p>
<p>
<a class="link" href="../../reference/basic_datagram_socket/receive_from.html" title="basic_datagram_socket::receive_from">basic_datagram_socket::receive_from()</a>,
<a class="link" href="../../reference/basic_datagram_socket/async_receive_from.html" title="basic_datagram_socket::async_receive_from">basic_datagram_socket::async_receive_from()</a>
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">send()</code>, <code class="computeroutput">write()</code>, <code class="computeroutput">writev()</code>
</p>
</td>
<td>
<p>
For TCP: <a class="link" href="../../reference/basic_stream_socket/write_some.html" title="basic_stream_socket::write_some">ip::tcp::socket::write_some()</a>,
<a class="link" href="../../reference/basic_stream_socket/async_write_some.html" title="basic_stream_socket::async_write_some">ip::tcp::socket::async_write_some()</a>,
<a class="link" href="../../reference/basic_stream_socket/send.html" title="basic_stream_socket::send">ip::tcp::socket::send()</a>,
<a class="link" href="../../reference/basic_stream_socket/async_send.html" title="basic_stream_socket::async_send">ip::tcp::socket::async_send()</a>
</p>
<p>
For UDP: <a class="link" href="../../reference/basic_datagram_socket/send.html" title="basic_datagram_socket::send">ip::udp::socket::send()</a>,
<a class="link" href="../../reference/basic_datagram_socket/async_send.html" title="basic_datagram_socket::async_send">ip::udp::socket::async_send()</a>
</p>
<p>
<a class="link" href="../../reference/basic_stream_socket/write_some.html" title="basic_stream_socket::write_some">basic_stream_socket::write_some()</a>,
<a class="link" href="../../reference/basic_stream_socket/async_write_some.html" title="basic_stream_socket::async_write_some">basic_stream_socket::async_write_some()</a>,
<a class="link" href="../../reference/basic_stream_socket/send.html" title="basic_stream_socket::send">basic_stream_socket::send()</a>,
<a class="link" href="../../reference/basic_stream_socket/async_send.html" title="basic_stream_socket::async_send">basic_stream_socket::async_send()</a>,
<a class="link" href="../../reference/basic_datagram_socket/send.html" title="basic_datagram_socket::send">basic_datagram_socket::send()</a>,
<a class="link" href="../../reference/basic_datagram_socket/async_send.html" title="basic_datagram_socket::async_send">basic_datagram_socket::async_send()</a>
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">sendto()</code>
</p>
</td>
<td>
<p>
For UDP: <a class="link" href="../../reference/basic_datagram_socket/send_to.html" title="basic_datagram_socket::send_to">ip::udp::socket::send_to()</a>,
<a class="link" href="../../reference/basic_datagram_socket/async_send_to.html" title="basic_datagram_socket::async_send_to">ip::udp::socket::async_send_to()</a>
</p>
<p>
<a class="link" href="../../reference/basic_datagram_socket/send_to.html" title="basic_datagram_socket::send_to">basic_datagram_socket::send_to()</a>,
<a class="link" href="../../reference/basic_datagram_socket/async_send_to.html" title="basic_datagram_socket::async_send_to">basic_datagram_socket::async_send_to()</a>
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">setsockopt()</code>
</p>
</td>
<td>
<p>
For TCP: <a class="link" href="../../reference/basic_socket/set_option.html" title="basic_socket::set_option">ip::tcp::acceptor::set_option()</a>,
<a class="link" href="../../reference/basic_socket/set_option.html" title="basic_socket::set_option">ip::tcp::socket::set_option()</a>
</p>
<p>
For UDP: <a class="link" href="../../reference/basic_socket/set_option.html" title="basic_socket::set_option">ip::udp::socket::set_option()</a>
</p>
<p>
<a class="link" href="../../reference/basic_socket/set_option.html" title="basic_socket::set_option">basic_socket::set_option()</a>
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">shutdown()</code>
</p>
</td>
<td>
<p>
For TCP: <a class="link" href="../../reference/basic_socket/shutdown.html" title="basic_socket::shutdown">ip::tcp::socket::shutdown()</a>
</p>
<p>
For UDP: <a class="link" href="../../reference/basic_socket/shutdown.html" title="basic_socket::shutdown">ip::udp::socket::shutdown()</a>
</p>
<p>
<a class="link" href="../../reference/basic_socket/shutdown.html" title="basic_socket::shutdown">basic_socket::shutdown()</a>
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">sockatmark()</code>
</p>
</td>
<td>
<p>
For TCP: <a class="link" href="../../reference/basic_socket/at_mark.html" title="basic_socket::at_mark">ip::tcp::socket::at_mark()</a>
</p>
<p>
<a class="link" href="../../reference/basic_socket/at_mark.html" title="basic_socket::at_mark">basic_socket::at_mark()</a>
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">socket()</code>
</p>
</td>
<td>
<p>
For TCP: <a class="link" href="../../reference/basic_socket/open.html" title="basic_socket::open">ip::tcp::acceptor::open()</a>,
<a class="link" href="../../reference/basic_socket/open.html" title="basic_socket::open">ip::tcp::socket::open()</a>
</p>
<p>
For UDP: <a class="link" href="../../reference/basic_socket/open.html" title="basic_socket::open">ip::udp::socket::open()</a>
</p>
<p>
<a class="link" href="../../reference/basic_socket/open.html" title="basic_socket::open">basic_socket::open()</a>
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">socketpair()</code>
</p>
</td>
<td>
<p>
<a class="link" href="../../reference/local__connect_pair.html" title="local::connect_pair">local::connect_pair()</a>
</p>
<p>
Note: POSIX operating systems only.
</p>
</td>
</tr>
</tbody>
</table></div>
</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-2020 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="iostreams.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../networking.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="../timers.html"><img src="../../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,112 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Socket Iostreams</title>
<link rel="stylesheet" href="../../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../../index.html" title="Asio">
<link rel="up" href="../networking.html" title="Networking">
<link rel="prev" href="other_protocols.html" title="Support for Other Protocols">
<link rel="next" href="bsd_sockets.html" title="The BSD Socket API and Asio">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="other_protocols.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../networking.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="bsd_sockets.html"><img src="../../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h4 class="title">
<a name="asio.overview.networking.iostreams"></a><a class="link" href="iostreams.html" title="Socket Iostreams">Socket Iostreams</a>
</h4></div></div></div>
<p>
Asio includes classes that implement iostreams on top of sockets. These
hide away the complexities associated with endpoint resolution, protocol
independence, etc. To create a connection one might simply write:
</p>
<pre class="programlisting">ip::tcp::iostream stream("www.boost.org", "http");
if (!stream)
{
// Can't connect.
}
</pre>
<p>
The iostream class can also be used in conjunction with an acceptor to
create simple servers. For example:
</p>
<pre class="programlisting">io_context ioc;
ip::tcp::endpoint endpoint(tcp::v4(), 80);
ip::tcp::acceptor acceptor(ios, endpoint);
for (;;)
{
ip::tcp::iostream stream;
acceptor.accept(stream.socket());
...
}
</pre>
<p>
Timeouts may be set by calling <code class="computeroutput">expires_at()</code> or <code class="computeroutput">expires_from_now()</code>
to establish a deadline. Any socket operations that occur past the deadline
will put the iostream into a "bad" state.
</p>
<p>
For example, a simple client program like this:
</p>
<pre class="programlisting">ip::tcp::iostream stream;
stream.expires_from_now(boost::posix_time::seconds(60));
stream.connect("www.boost.org", "http");
stream &lt;&lt; "GET /LICENSE_1_0.txt HTTP/1.0\r\n";
stream &lt;&lt; "Host: www.boost.org\r\n";
stream &lt;&lt; "Accept: */*\r\n";
stream &lt;&lt; "Connection: close\r\n\r\n";
stream.flush();
std::cout &lt;&lt; stream.rdbuf();
</pre>
<p>
will fail if all the socket operations combined take longer than 60 seconds.
</p>
<p>
If an error does occur, the iostream's <code class="computeroutput">error()</code> member function
may be used to retrieve the error code from the most recent system call:
</p>
<pre class="programlisting">if (!stream)
{
std::cout &lt;&lt; "Error: " &lt;&lt; stream.error().message() &lt;&lt; "\n";
}
</pre>
<h6>
<a name="asio.overview.networking.iostreams.h0"></a>
<span><a name="asio.overview.networking.iostreams.see_also"></a></span><a class="link" href="iostreams.html#asio.overview.networking.iostreams.see_also">See
Also</a>
</h6>
<p>
<a class="link" href="../../reference/ip__tcp/iostream.html" title="ip::tcp::iostream">ip::tcp::iostream</a>,
<a class="link" href="../../reference/basic_socket_iostream.html" title="basic_socket_iostream">basic_socket_iostream</a>,
<a class="link" href="../../examples/cpp03_examples.html#asio.examples.cpp03_examples.iostreams">iostreams examples</a>.
</p>
<h6>
<a name="asio.overview.networking.iostreams.h1"></a>
<span><a name="asio.overview.networking.iostreams.notes"></a></span><a class="link" href="iostreams.html#asio.overview.networking.iostreams.notes">Notes</a>
</h6>
<p>
These iostream templates only support <code class="computeroutput">char</code>, not <code class="computeroutput">wchar_t</code>,
and do not perform any code conversion.
</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-2020 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="other_protocols.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../networking.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="bsd_sockets.html"><img src="../../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,152 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Support for Other Protocols</title>
<link rel="stylesheet" href="../../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../../index.html" title="Asio">
<link rel="up" href="../networking.html" title="Networking">
<link rel="prev" href="protocols.html" title="TCP, UDP and ICMP">
<link rel="next" href="iostreams.html" title="Socket Iostreams">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="protocols.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../networking.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="iostreams.html"><img src="../../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h4 class="title">
<a name="asio.overview.networking.other_protocols"></a><a class="link" href="other_protocols.html" title="Support for Other Protocols">Support for
Other Protocols</a>
</h4></div></div></div>
<p>
Support for other socket protocols (such as Bluetooth or IRCOMM sockets)
can be added by implementing the <a class="link" href="../../reference/Protocol.html" title="Protocol requirements">protocol
type requirements</a>. However, in many cases these protocols may also
be used with Asio's generic protocol support. For this, Asio provides the
following four classes:
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem">
<a class="link" href="../../reference/generic__datagram_protocol.html" title="generic::datagram_protocol"><code class="computeroutput">generic::datagram_protocol</code></a>
</li>
<li class="listitem">
<a class="link" href="../../reference/generic__raw_protocol.html" title="generic::raw_protocol"><code class="computeroutput">generic::raw_protocol</code></a>
</li>
<li class="listitem">
<a class="link" href="../../reference/generic__seq_packet_protocol.html" title="generic::seq_packet_protocol"><code class="computeroutput">generic::seq_packet_protocol</code></a>
</li>
<li class="listitem">
<a class="link" href="../../reference/generic__stream_protocol.html" title="generic::stream_protocol"><code class="computeroutput">generic::stream_protocol</code></a>
</li>
</ul></div>
<p>
These classes implement the <a class="link" href="../../reference/Protocol.html" title="Protocol requirements">protocol
type requirements</a>, but allow the user to specify the address family
(e.g. <code class="computeroutput">AF_INET</code>) and protocol type (e.g. <code class="computeroutput">IPPROTO_TCP</code>)
at runtime. For example:
</p>
<pre class="programlisting">asio::generic::stream_protocol::socket my_socket(my_io_context);
my_socket.open(asio::generic::stream_protocol(AF_INET, IPPROTO_TCP));
...
</pre>
<p>
An endpoint class template, <a class="link" href="../../reference/generic__basic_endpoint.html" title="generic::basic_endpoint"><code class="computeroutput">asio::generic::basic_endpoint</code></a>,
is included to support these protocol classes. This endpoint can hold any
other endpoint type, provided its native representation fits into a <code class="computeroutput">sockaddr_storage</code>
object. This class will also convert from other types that implement the
<a class="link" href="../../reference/Endpoint.html" title="Endpoint requirements">endpoint</a> type requirements:
</p>
<pre class="programlisting">asio::ip::tcp::endpoint my_endpoint1 = ...;
asio::generic::stream_protocol::endpoint my_endpoint2(my_endpoint1);
</pre>
<p>
The conversion is implicit, so as to support the following use cases:
</p>
<pre class="programlisting">asio::generic::stream_protocol::socket my_socket(my_io_context);
asio::ip::tcp::endpoint my_endpoint = ...;
my_socket.connect(my_endpoint);
</pre>
<h6>
<a name="asio.overview.networking.other_protocols.h0"></a>
<span><a name="asio.overview.networking.other_protocols.c__11_move_construction"></a></span><a class="link" href="other_protocols.html#asio.overview.networking.other_protocols.c__11_move_construction">C++11
Move Construction</a>
</h6>
<p>
When using C++11, it is possible to perform move construction from a socket
(or acceptor) object to convert to the more generic protocol's socket (or
acceptor) type. If the protocol conversion is valid:
</p>
<pre class="programlisting">Protocol1 p1 = ...;
Protocol2 p2(p1);
</pre>
<p>
then the corresponding socket conversion is allowed:
</p>
<pre class="programlisting">Protocol1::socket my_socket1(my_io_context);
...
Protocol2::socket my_socket2(std::move(my_socket1));
</pre>
<p>
For example, one possible conversion is from a TCP socket to a generic
stream-oriented socket:
</p>
<pre class="programlisting">asio::ip::tcp::socket my_socket1(my_io_context);
...
asio::generic::stream_protocol::socket my_socket2(std::move(my_socket1));
</pre>
<p>
These conversions are also available for move-assignment.
</p>
<p>
These conversions are not limited to the above generic protocol classes.
User-defined protocols may take advantage of this feature by similarly
ensuring the conversion from <code class="computeroutput">Protocol1</code> to <code class="computeroutput">Protocol2</code>
is valid, as above.
</p>
<h6>
<a name="asio.overview.networking.other_protocols.h1"></a>
<span><a name="asio.overview.networking.other_protocols.accepting_generic_sockets"></a></span><a class="link" href="other_protocols.html#asio.overview.networking.other_protocols.accepting_generic_sockets">Accepting
Generic Sockets</a>
</h6>
<p>
As a convenience, a socket acceptor's <code class="computeroutput">accept()</code> and <code class="computeroutput">async_accept()</code>
functions can directly accept into a different protocol's socket type,
provided the corresponding protocol conversion is valid. For example, the
following is supported because the protocol <code class="computeroutput">asio::ip::tcp</code>
is convertible to <code class="computeroutput">asio::generic::stream_protocol</code>:
</p>
<pre class="programlisting">asio::ip::tcp::acceptor my_acceptor(my_io_context);
...
asio::generic::stream_protocol::socket my_socket(my_io_context);
my_acceptor.accept(my_socket);
</pre>
<h6>
<a name="asio.overview.networking.other_protocols.h2"></a>
<span><a name="asio.overview.networking.other_protocols.see_also"></a></span><a class="link" href="other_protocols.html#asio.overview.networking.other_protocols.see_also">See
Also</a>
</h6>
<p>
<a class="link" href="../../reference/generic__datagram_protocol.html" title="generic::datagram_protocol"><code class="computeroutput">generic::datagram_protocol</code></a>,
<a class="link" href="../../reference/generic__raw_protocol.html" title="generic::raw_protocol"><code class="computeroutput">generic::raw_protocol</code></a>,
<a class="link" href="../../reference/generic__seq_packet_protocol.html" title="generic::seq_packet_protocol"><code class="computeroutput">generic::seq_packet_protocol</code></a>,
<a class="link" href="../../reference/generic__stream_protocol.html" title="generic::stream_protocol"><code class="computeroutput">generic::stream_protocol</code></a>,
<a class="link" href="../../reference/Protocol.html" title="Protocol requirements">protocol type requirements</a>.
</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-2020 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="protocols.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../networking.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="iostreams.html"><img src="../../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,204 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>TCP, UDP and ICMP</title>
<link rel="stylesheet" href="../../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../../index.html" title="Asio">
<link rel="up" href="../networking.html" title="Networking">
<link rel="prev" href="../networking.html" title="Networking">
<link rel="next" href="other_protocols.html" title="Support for Other Protocols">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="../networking.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../networking.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="other_protocols.html"><img src="../../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h4 class="title">
<a name="asio.overview.networking.protocols"></a><a class="link" href="protocols.html" title="TCP, UDP and ICMP">TCP, UDP and ICMP</a>
</h4></div></div></div>
<p>
Asio provides off-the-shelf support for the internet protocols TCP, UDP
and ICMP.
</p>
<h6>
<a name="asio.overview.networking.protocols.h0"></a>
<span><a name="asio.overview.networking.protocols.tcp_clients"></a></span><a class="link" href="protocols.html#asio.overview.networking.protocols.tcp_clients">TCP
Clients</a>
</h6>
<p>
Hostname resolution is performed using a resolver, where host and service
names are looked up and converted into one or more endpoints:
</p>
<pre class="programlisting">ip::tcp::resolver resolver(my_io_context);
ip::tcp::resolver::query query("www.boost.org", "http");
ip::tcp::resolver::iterator iter = resolver.resolve(query);
ip::tcp::resolver::iterator end; // End marker.
while (iter != end)
{
ip::tcp::endpoint endpoint = *iter++;
std::cout &lt;&lt; endpoint &lt;&lt; std::endl;
}
</pre>
<p>
The list of endpoints obtained above could contain both IPv4 and IPv6 endpoints,
so a program should try each of them until it finds one that works. This
keeps the client program independent of a specific IP version.
</p>
<p>
To simplify the development of protocol-independent programs, TCP clients
may establish connections using the free functions <a class="link" href="../../reference/connect.html" title="connect">connect()</a>
and <a class="link" href="../../reference/async_connect.html" title="async_connect">async_connect()</a>.
These operations try each endpoint in a list until the socket is successfully
connected. For example, a single call:
</p>
<pre class="programlisting">ip::tcp::socket socket(my_io_context);
asio::connect(socket, resolver.resolve(query));
</pre>
<p>
will synchronously try all endpoints until one is successfully connected.
Similarly, an asynchronous connect may be performed by writing:
</p>
<pre class="programlisting">asio::async_connect(socket_, iter,
boost::bind(&amp;client::handle_connect, this,
asio::placeholders::error));
// ...
void handle_connect(const error_code&amp; error)
{
if (!error)
{
// Start read or write operations.
}
else
{
// Handle error.
}
}
</pre>
<p>
When a specific endpoint is available, a socket can be created and connected:
</p>
<pre class="programlisting">ip::tcp::socket socket(my_io_context);
socket.connect(endpoint);
</pre>
<p>
Data may be read from or written to a connected TCP socket using the <a class="link" href="../../reference/basic_stream_socket/receive.html" title="basic_stream_socket::receive">receive()</a>,
<a class="link" href="../../reference/basic_stream_socket/async_receive.html" title="basic_stream_socket::async_receive">async_receive()</a>,
<a class="link" href="../../reference/basic_stream_socket/send.html" title="basic_stream_socket::send">send()</a> or
<a class="link" href="../../reference/basic_stream_socket/async_send.html" title="basic_stream_socket::async_send">async_send()</a>
member functions. However, as these could result in <a class="link" href="../core/streams.html" title="Streams, Short Reads and Short Writes">short
writes or reads</a>, an application will typically use the following
operations instead: <a class="link" href="../../reference/read.html" title="read">read()</a>,
<a class="link" href="../../reference/async_read.html" title="async_read">async_read()</a>, <a class="link" href="../../reference/write.html" title="write">write()</a>
and <a class="link" href="../../reference/async_write.html" title="async_write">async_write()</a>.
</p>
<h6>
<a name="asio.overview.networking.protocols.h1"></a>
<span><a name="asio.overview.networking.protocols.tcp_servers"></a></span><a class="link" href="protocols.html#asio.overview.networking.protocols.tcp_servers">TCP
Servers</a>
</h6>
<p>
A program uses an acceptor to accept incoming TCP connections:
</p>
<pre class="programlisting">ip::tcp::acceptor acceptor(my_io_context, my_endpoint);
...
ip::tcp::socket socket(my_io_context);
acceptor.accept(socket);
</pre>
<p>
After a socket has been successfully accepted, it may be read from or written
to as illustrated for TCP clients above.
</p>
<h6>
<a name="asio.overview.networking.protocols.h2"></a>
<span><a name="asio.overview.networking.protocols.udp"></a></span><a class="link" href="protocols.html#asio.overview.networking.protocols.udp">UDP</a>
</h6>
<p>
UDP hostname resolution is also performed using a resolver:
</p>
<pre class="programlisting">ip::udp::resolver resolver(my_io_context);
ip::udp::resolver::query query("localhost", "daytime");
ip::udp::resolver::iterator iter = resolver.resolve(query);
...
</pre>
<p>
A UDP socket is typically bound to a local endpoint. The following code
will create an IP version 4 UDP socket and bind it to the "any"
address on port <code class="computeroutput">12345</code>:
</p>
<pre class="programlisting">ip::udp::endpoint endpoint(ip::udp::v4(), 12345);
ip::udp::socket socket(my_io_context, endpoint);
</pre>
<p>
Data may be read from or written to an unconnected UDP socket using the
<a class="link" href="../../reference/basic_datagram_socket/receive_from.html" title="basic_datagram_socket::receive_from">receive_from()</a>,
<a class="link" href="../../reference/basic_datagram_socket/async_receive_from.html" title="basic_datagram_socket::async_receive_from">async_receive_from()</a>,
<a class="link" href="../../reference/basic_datagram_socket/send_to.html" title="basic_datagram_socket::send_to">send_to()</a>
or <a class="link" href="../../reference/basic_datagram_socket/async_send_to.html" title="basic_datagram_socket::async_send_to">async_send_to()</a>
member functions. For a connected UDP socket, use the <a class="link" href="../../reference/basic_datagram_socket/receive.html" title="basic_datagram_socket::receive">receive()</a>,
<a class="link" href="../../reference/basic_datagram_socket/async_receive.html" title="basic_datagram_socket::async_receive">async_receive()</a>,
<a class="link" href="../../reference/basic_datagram_socket/send.html" title="basic_datagram_socket::send">send()</a>
or <a class="link" href="../../reference/basic_datagram_socket/async_send.html" title="basic_datagram_socket::async_send">async_send()</a>
member functions.
</p>
<h6>
<a name="asio.overview.networking.protocols.h3"></a>
<span><a name="asio.overview.networking.protocols.icmp"></a></span><a class="link" href="protocols.html#asio.overview.networking.protocols.icmp">ICMP</a>
</h6>
<p>
As with TCP and UDP, ICMP hostname resolution is performed using a resolver:
</p>
<pre class="programlisting">ip::icmp::resolver resolver(my_io_context);
ip::icmp::resolver::query query("localhost", "");
ip::icmp::resolver::iterator iter = resolver.resolve(query);
...
</pre>
<p>
An ICMP socket may be bound to a local endpoint. The following code will
create an IP version 6 ICMP socket and bind it to the "any" address:
</p>
<pre class="programlisting">ip::icmp::endpoint endpoint(ip::icmp::v6(), 0);
ip::icmp::socket socket(my_io_context, endpoint);
</pre>
<p>
The port number is not used for ICMP.
</p>
<p>
Data may be read from or written to an unconnected ICMP socket using the
<a class="link" href="../../reference/basic_raw_socket/receive_from.html" title="basic_raw_socket::receive_from">receive_from()</a>,
<a class="link" href="../../reference/basic_raw_socket/async_receive_from.html" title="basic_raw_socket::async_receive_from">async_receive_from()</a>,
<a class="link" href="../../reference/basic_raw_socket/send_to.html" title="basic_raw_socket::send_to">send_to()</a>
or <a class="link" href="../../reference/basic_raw_socket/async_send_to.html" title="basic_raw_socket::async_send_to">async_send_to()</a>
member functions.
</p>
<h6>
<a name="asio.overview.networking.protocols.h4"></a>
<span><a name="asio.overview.networking.protocols.see_also"></a></span><a class="link" href="protocols.html#asio.overview.networking.protocols.see_also">See
Also</a>
</h6>
<p>
<a class="link" href="../../reference/ip__tcp.html" title="ip::tcp">ip::tcp</a>, <a class="link" href="../../reference/ip__udp.html" title="ip::udp">ip::udp</a>,
<a class="link" href="../../reference/ip__icmp.html" title="ip::icmp">ip::icmp</a>, <a class="link" href="../../tutorial/tutdaytime1.html" title="Daytime.1 - A synchronous TCP daytime client">daytime
protocol tutorials</a>, <a class="link" href="../../examples/cpp03_examples.html#asio.examples.cpp03_examples.icmp">ICMP
ping example</a>.
</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-2020 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="../networking.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../networking.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="other_protocols.html"><img src="../../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,47 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>POSIX-Specific Functionality</title>
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../index.html" title="Asio">
<link rel="up" href="../overview.html" title="Overview">
<link rel="prev" href="signals.html" title="Signal Handling">
<link rel="next" href="posix/local.html" title="UNIX Domain Sockets">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="signals.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../overview.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="posix/local.html"><img src="../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="asio.overview.posix"></a><a class="link" href="posix.html" title="POSIX-Specific Functionality">POSIX-Specific Functionality</a>
</h3></div></div></div>
<p>
<a class="link" href="posix/local.html" title="UNIX Domain Sockets">UNIX Domain Sockets</a>
</p>
<p>
<a class="link" href="posix/stream_descriptor.html" title="Stream-Oriented File Descriptors">Stream-Oriented File
Descriptors</a>
</p>
<p>
<a class="link" href="posix/fork.html" title="Fork">Fork</a>
</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-2020 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="signals.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../overview.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="posix/local.html"><img src="../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,77 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Fork</title>
<link rel="stylesheet" href="../../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../../index.html" title="Asio">
<link rel="up" href="../posix.html" title="POSIX-Specific Functionality">
<link rel="prev" href="stream_descriptor.html" title="Stream-Oriented File Descriptors">
<link rel="next" href="../windows.html" title="Windows-Specific Functionality">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="stream_descriptor.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../posix.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="../windows.html"><img src="../../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h4 class="title">
<a name="asio.overview.posix.fork"></a><a class="link" href="fork.html" title="Fork">Fork</a>
</h4></div></div></div>
<p>
Asio supports programs that utilise the <code class="computeroutput">fork()</code> system call.
Provided the program calls <code class="computeroutput">io_context.notify_fork()</code> at the
appropriate times, Asio will recreate any internal file descriptors (such
as the "self-pipe trick" descriptor used for waking up a reactor).
The notification is usually performed as follows:
</p>
<pre class="programlisting">io_context_.notify_fork(asio::io_context::fork_prepare);
if (fork() == 0)
{
io_context_.notify_fork(asio::io_context::fork_child);
...
}
else
{
io_context_.notify_fork(asio::io_context::fork_parent);
...
}
</pre>
<p>
User-defined services can also be made fork-aware by overriding the <code class="computeroutput">io_context::service::notify_fork()</code>
virtual function.
</p>
<p>
Note that any file descriptors accessible via Asio's public API (e.g. the
descriptors underlying <code class="computeroutput">basic_socket&lt;&gt;</code>, <code class="computeroutput">posix::stream_descriptor</code>,
etc.) are not altered during a fork. It is the program's responsibility
to manage these as required.
</p>
<h6>
<a name="asio.overview.posix.fork.h0"></a>
<span><a name="asio.overview.posix.fork.see_also"></a></span><a class="link" href="fork.html#asio.overview.posix.fork.see_also">See
Also</a>
</h6>
<p>
<a class="link" href="../../reference/io_context/notify_fork.html" title="io_context::notify_fork">io_context::notify_fork()</a>,
<a class="link" href="../../reference/io_context/fork_event.html" title="io_context::fork_event">io_context::fork_event</a>,
<a class="link" href="../../reference/execution_context__service/notify_fork.html" title="execution_context::service::notify_fork">io_context::service::notify_fork()</a>,
<a class="link" href="../../examples/cpp03_examples.html#asio.examples.cpp03_examples.fork">Fork examples</a>.
</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-2020 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="stream_descriptor.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../posix.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="../windows.html"><img src="../../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,104 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>UNIX Domain Sockets</title>
<link rel="stylesheet" href="../../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../../index.html" title="Asio">
<link rel="up" href="../posix.html" title="POSIX-Specific Functionality">
<link rel="prev" href="../posix.html" title="POSIX-Specific Functionality">
<link rel="next" href="stream_descriptor.html" title="Stream-Oriented File Descriptors">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="../posix.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../posix.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="stream_descriptor.html"><img src="../../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h4 class="title">
<a name="asio.overview.posix.local"></a><a class="link" href="local.html" title="UNIX Domain Sockets">UNIX Domain Sockets</a>
</h4></div></div></div>
<p>
Asio provides basic support for UNIX domain sockets (also known as local
sockets). The simplest use involves creating a pair of connected sockets.
The following code:
</p>
<pre class="programlisting">local::stream_protocol::socket socket1(my_io_context);
local::stream_protocol::socket socket2(my_io_context);
local::connect_pair(socket1, socket2);
</pre>
<p>
will create a pair of stream-oriented sockets. To do the same for datagram-oriented
sockets, use:
</p>
<pre class="programlisting">local::datagram_protocol::socket socket1(my_io_context);
local::datagram_protocol::socket socket2(my_io_context);
local::connect_pair(socket1, socket2);
</pre>
<p>
A UNIX domain socket server may be created by binding an acceptor to an
endpoint, in much the same way as one does for a TCP server:
</p>
<pre class="programlisting">::unlink("/tmp/foobar"); // Remove previous binding.
local::stream_protocol::endpoint ep("/tmp/foobar");
local::stream_protocol::acceptor acceptor(my_io_context, ep);
local::stream_protocol::socket socket(my_io_context);
acceptor.accept(socket);
</pre>
<p>
A client that connects to this server might look like:
</p>
<pre class="programlisting">local::stream_protocol::endpoint ep("/tmp/foobar");
local::stream_protocol::socket socket(my_io_context);
socket.connect(ep);
</pre>
<p>
Transmission of file descriptors or credentials across UNIX domain sockets
is not directly supported within Asio, but may be achieved by accessing
the socket's underlying descriptor using the <a class="link" href="../../reference/basic_socket/native_handle.html" title="basic_socket::native_handle">native_handle()</a>
member function.
</p>
<h6>
<a name="asio.overview.posix.local.h0"></a>
<span><a name="asio.overview.posix.local.see_also"></a></span><a class="link" href="local.html#asio.overview.posix.local.see_also">See
Also</a>
</h6>
<p>
<a class="link" href="../../reference/local__connect_pair.html" title="local::connect_pair">local::connect_pair</a>,
<a class="link" href="../../reference/local__datagram_protocol.html" title="local::datagram_protocol">local::datagram_protocol</a>,
<a class="link" href="../../reference/local__datagram_protocol/endpoint.html" title="local::datagram_protocol::endpoint">local::datagram_protocol::endpoint</a>,
<a class="link" href="../../reference/local__datagram_protocol/socket.html" title="local::datagram_protocol::socket">local::datagram_protocol::socket</a>,
<a class="link" href="../../reference/local__stream_protocol.html" title="local::stream_protocol">local::stream_protocol</a>,
<a class="link" href="../../reference/local__stream_protocol/acceptor.html" title="local::stream_protocol::acceptor">local::stream_protocol::acceptor</a>,
<a class="link" href="../../reference/local__stream_protocol/endpoint.html" title="local::stream_protocol::endpoint">local::stream_protocol::endpoint</a>,
<a class="link" href="../../reference/local__stream_protocol/iostream.html" title="local::stream_protocol::iostream">local::stream_protocol::iostream</a>,
<a class="link" href="../../reference/local__stream_protocol/socket.html" title="local::stream_protocol::socket">local::stream_protocol::socket</a>,
<a class="link" href="../../examples/cpp03_examples.html#asio.examples.cpp03_examples.unix_domain_sockets">UNIX domain
sockets examples</a>.
</p>
<h6>
<a name="asio.overview.posix.local.h1"></a>
<span><a name="asio.overview.posix.local.notes"></a></span><a class="link" href="local.html#asio.overview.posix.local.notes">Notes</a>
</h6>
<p>
UNIX domain sockets are only available at compile time if supported by
the target operating system. A program may test for the macro <code class="computeroutput">ASIO_HAS_LOCAL_SOCKETS</code>
to determine whether they are supported.
</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-2020 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="../posix.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../posix.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="stream_descriptor.html"><img src="../../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,86 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Stream-Oriented File Descriptors</title>
<link rel="stylesheet" href="../../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../../index.html" title="Asio">
<link rel="up" href="../posix.html" title="POSIX-Specific Functionality">
<link rel="prev" href="local.html" title="UNIX Domain Sockets">
<link rel="next" href="fork.html" title="Fork">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="local.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../posix.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="fork.html"><img src="../../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h4 class="title">
<a name="asio.overview.posix.stream_descriptor"></a><a class="link" href="stream_descriptor.html" title="Stream-Oriented File Descriptors">Stream-Oriented
File Descriptors</a>
</h4></div></div></div>
<p>
Asio includes classes added to permit synchronous and asynchronous read
and write operations to be performed on POSIX file descriptors, such as
pipes, standard input and output, and various devices.
</p>
<p>
These classes also provide limited support for regular files. This support
assumes that the underlying read and write operations provided by the operating
system never fail with <code class="computeroutput">EAGAIN</code> or <code class="computeroutput">EWOULDBLOCK</code>.
(This assumption normally holds for buffered file I/O.) Synchronous and
asynchronous read and write operations on file descriptors will succeed
but the I/O will always be performed immediately. Wait operations, and
operations involving <code class="computeroutput">asio::null_buffers</code>, are not portably
supported.
</p>
<p>
For example, to perform read and write operations on standard input and
output, the following objects may be created:
</p>
<pre class="programlisting">posix::stream_descriptor in(my_io_context, ::dup(STDIN_FILENO));
posix::stream_descriptor out(my_io_context, ::dup(STDOUT_FILENO));
</pre>
<p>
These are then used as synchronous or asynchronous read and write streams.
This means the objects can be used with any of the <a class="link" href="../../reference/read.html" title="read">read()</a>,
<a class="link" href="../../reference/async_read.html" title="async_read">async_read()</a>, <a class="link" href="../../reference/write.html" title="write">write()</a>,
<a class="link" href="../../reference/async_write.html" title="async_write">async_write()</a>, <a class="link" href="../../reference/read_until.html" title="read_until">read_until()</a> or <a class="link" href="../../reference/async_read_until.html" title="async_read_until">async_read_until()</a>
free functions.
</p>
<h6>
<a name="asio.overview.posix.stream_descriptor.h0"></a>
<span><a name="asio.overview.posix.stream_descriptor.see_also"></a></span><a class="link" href="stream_descriptor.html#asio.overview.posix.stream_descriptor.see_also">See
Also</a>
</h6>
<p>
<a class="link" href="../../reference/posix__stream_descriptor.html" title="posix::stream_descriptor">posix::stream_descriptor</a>,
<a class="link" href="../../examples/cpp03_examples.html#asio.examples.cpp03_examples.chat">Chat example (C++03)</a>,
<a class="link" href="../../examples/cpp11_examples.html#asio.examples.cpp11_examples.chat">Chat example (C++11)</a>.
</p>
<h6>
<a name="asio.overview.posix.stream_descriptor.h1"></a>
<span><a name="asio.overview.posix.stream_descriptor.notes"></a></span><a class="link" href="stream_descriptor.html#asio.overview.posix.stream_descriptor.notes">Notes</a>
</h6>
<p>
POSIX stream descriptors are only available at compile time if supported
by the target operating system. A program may test for the macro <code class="computeroutput">ASIO_HAS_POSIX_STREAM_DESCRIPTOR</code>
to determine whether they are supported.
</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-2020 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="local.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../posix.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="fork.html"><img src="../../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,97 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Rationale</title>
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../index.html" title="Asio">
<link rel="up" href="../overview.html" title="Overview">
<link rel="prev" href="../overview.html" title="Overview">
<link rel="next" href="core.html" title="Core Concepts and Functionality">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="../overview.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../overview.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="core.html"><img src="../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="asio.overview.rationale"></a><a class="link" href="rationale.html" title="Rationale">Rationale</a>
</h3></div></div></div>
<p>
Most programs interact with the outside world in some way, whether it be
via a file, a network, a serial cable, or the console. Sometimes, as is the
case with networking, individual I/O operations can take a long time to complete.
This poses particular challenges to application development.
</p>
<p>
Asio provides the tools to manage these long running operations, without
requiring programs to use concurrency models based on threads and explicit
locking.
</p>
<p>
The Asio library is intended for programmers using C++ for systems programming,
where access to operating system functionality such as networking is often
required. In particular, Asio addresses the following goals:
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem">
<span class="bold"><strong>Portability.</strong></span> The library should support
a range of commonly used operating systems, and provide consistent behaviour
across these operating systems.
</li>
<li class="listitem">
<span class="bold"><strong>Scalability.</strong></span> The library should facilitate
the development of network applications that scale to thousands of concurrent
connections. The library implementation for each operating system should
use the mechanism that best enables this scalability.
</li>
<li class="listitem">
<span class="bold"><strong>Efficiency.</strong></span> The library should support
techniques such as scatter-gather I/O, and allow programs to minimise
data copying.
</li>
<li class="listitem">
<span class="bold"><strong>Model concepts from established APIs, such as BSD
sockets.</strong></span> The BSD socket API is widely implemented and understood,
and is covered in much literature. Other programming languages often
use a similar interface for networking APIs. As far as is reasonable,
Asio should leverage existing practice.
</li>
<li class="listitem">
<span class="bold"><strong>Ease of use.</strong></span> The library should provide
a lower entry barrier for new users by taking a toolkit, rather than
framework, approach. That is, it should try to minimise the up-front
investment in time to just learning a few basic rules and guidelines.
After that, a library user should only need to understand the specific
functions that are being used.
</li>
<li class="listitem">
<span class="bold"><strong>Basis for further abstraction.</strong></span> The library
should permit the development of other libraries that provide higher
levels of abstraction. For example, implementations of commonly used
protocols such as HTTP.
</li>
</ul></div>
<p>
Although Asio started life focused primarily on networking, its concepts
of asynchronous I/O have been extended to include other operating system
resources such as serial ports, file descriptors, and so on.
</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-2020 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="../overview.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../overview.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="core.html"><img src="../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,83 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Serial Ports</title>
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../index.html" title="Asio">
<link rel="up" href="../overview.html" title="Overview">
<link rel="prev" href="timers.html" title="Timers">
<link rel="next" href="signals.html" title="Signal Handling">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="timers.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../overview.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="signals.html"><img src="../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="asio.overview.serial_ports"></a><a class="link" href="serial_ports.html" title="Serial Ports">Serial Ports</a>
</h3></div></div></div>
<p>
Asio includes classes for creating and manipulating serial ports in a portable
manner. For example, a serial port may be opened using:
</p>
<pre class="programlisting">serial_port port(my_io_context, name);
</pre>
<p>
where name is something like <code class="computeroutput">"COM1"</code> on Windows, and
<code class="computeroutput">"/dev/ttyS0"</code> on POSIX platforms.
</p>
<p>
Once opened, the serial port may be used as a <a class="link" href="core/streams.html" title="Streams, Short Reads and Short Writes">stream</a>.
This means the objects can be used with any of the <a class="link" href="../reference/read.html" title="read">read()</a>,
<a class="link" href="../reference/async_read.html" title="async_read">async_read()</a>, <a class="link" href="../reference/write.html" title="write">write()</a>,
<a class="link" href="../reference/async_write.html" title="async_write">async_write()</a>, <a class="link" href="../reference/read_until.html" title="read_until">read_until()</a>
or <a class="link" href="../reference/async_read_until.html" title="async_read_until">async_read_until()</a>
free functions.
</p>
<p>
The serial port implementation also includes option classes for configuring
the port's baud rate, flow control type, parity, stop bits and character
size.
</p>
<h5>
<a name="asio.overview.serial_ports.h0"></a>
<span><a name="asio.overview.serial_ports.see_also"></a></span><a class="link" href="serial_ports.html#asio.overview.serial_ports.see_also">See
Also</a>
</h5>
<p>
<a class="link" href="../reference/serial_port.html" title="serial_port">serial_port</a>, <a class="link" href="../reference/serial_port_base.html" title="serial_port_base">serial_port_base</a>,
<a class="link" href="../reference/serial_port_base__baud_rate.html" title="serial_port_base::baud_rate">serial_port_base::baud_rate</a>,
<a class="link" href="../reference/serial_port_base__flow_control.html" title="serial_port_base::flow_control">serial_port_base::flow_control</a>,
<a class="link" href="../reference/serial_port_base__parity.html" title="serial_port_base::parity">serial_port_base::parity</a>,
<a class="link" href="../reference/serial_port_base__stop_bits.html" title="serial_port_base::stop_bits">serial_port_base::stop_bits</a>,
<a class="link" href="../reference/serial_port_base__character_size.html" title="serial_port_base::character_size">serial_port_base::character_size</a>.
</p>
<h5>
<a name="asio.overview.serial_ports.h1"></a>
<span><a name="asio.overview.serial_ports.notes"></a></span><a class="link" href="serial_ports.html#asio.overview.serial_ports.notes">Notes</a>
</h5>
<p>
Serial ports are available on all POSIX platforms. For Windows, serial ports
are only available at compile time when the I/O completion port backend is
used (which is the default). A program may test for the macro <code class="computeroutput">ASIO_HAS_SERIAL_PORT</code>
to determine whether they are supported.
</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-2020 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="timers.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../overview.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="signals.html"><img src="../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,76 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Signal Handling</title>
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../index.html" title="Asio">
<link rel="up" href="../overview.html" title="Overview">
<link rel="prev" href="serial_ports.html" title="Serial Ports">
<link rel="next" href="posix.html" title="POSIX-Specific Functionality">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="serial_ports.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../overview.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="posix.html"><img src="../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="asio.overview.signals"></a><a class="link" href="signals.html" title="Signal Handling">Signal Handling</a>
</h3></div></div></div>
<p>
Asio supports signal handling using a class called <a class="link" href="../reference/signal_set.html" title="signal_set">signal_set</a>.
Programs may add one or more signals to the set, and then perform an <code class="computeroutput">async_wait()</code>
operation. The specified handler will be called when one of the signals occurs.
The same signal number may be registered with multiple <a class="link" href="../reference/signal_set.html" title="signal_set">signal_set</a>
objects, however the signal number must be used only with Asio.
</p>
<pre class="programlisting">void handler(
const asio::error_code&amp; error,
int signal_number)
{
if (!error)
{
// A signal occurred.
}
}
...
// Construct a signal set registered for process termination.
asio::signal_set signals(io_context, SIGINT, SIGTERM);
// Start an asynchronous wait for one of the signals to occur.
signals.async_wait(handler);
</pre>
<p>
Signal handling also works on Windows, as the Microsoft Visual C++ runtime
library maps console events like Ctrl+C to the equivalent signal.
</p>
<h5>
<a name="asio.overview.signals.h0"></a>
<span><a name="asio.overview.signals.see_also"></a></span><a class="link" href="signals.html#asio.overview.signals.see_also">See
Also</a>
</h5>
<p>
<a class="link" href="../reference/signal_set.html" title="signal_set">signal_set</a>, <a class="link" href="../examples/cpp03_examples.html#asio.examples.cpp03_examples.http_server">HTTP
server example (C++03)</a>, <a class="link" href="../examples/cpp11_examples.html#asio.examples.cpp11_examples.http_server">HTTP
server example (C++11)</a>.
</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-2020 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="serial_ports.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../overview.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="posix.html"><img src="../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,189 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>SSL</title>
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../index.html" title="Asio">
<link rel="up" href="../overview.html" title="Overview">
<link rel="prev" href="windows/object_handle.html" title="Object HANDLEs">
<link rel="next" href="cpp2011.html" title="C++ 2011 Support">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="windows/object_handle.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../overview.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="cpp2011.html"><img src="../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="asio.overview.ssl"></a><a class="link" href="ssl.html" title="SSL">SSL</a>
</h3></div></div></div>
<p>
Asio contains classes and class templates for basic SSL support. These classes
allow encrypted communication to be layered on top of an existing stream,
such as a TCP socket.
</p>
<p>
Before creating an encrypted stream, an application must construct an SSL
context object. This object is used to set SSL options such as verification
mode, certificate files, and so on. As an illustration, client-side initialisation
may look something like:
</p>
<pre class="programlisting">ssl::context ctx(ssl::context::sslv23);
ctx.set_verify_mode(ssl::verify_peer);
ctx.load_verify_file("ca.pem");
</pre>
<p>
To use SSL with a TCP socket, one may write:
</p>
<pre class="programlisting">ssl::stream&lt;ip::tcp::socket&gt; ssl_sock(my_io_context, ctx);
</pre>
<p>
To perform socket-specific operations, such as establishing an outbound connection
or accepting an incoming one, the underlying socket must first be obtained
using the <code class="computeroutput">ssl::stream</code> template's <a class="link" href="../reference/ssl__stream/lowest_layer.html" title="ssl::stream::lowest_layer"><code class="computeroutput">lowest_layer()</code></a>
member function:
</p>
<pre class="programlisting">ip::tcp::socket::lowest_layer_type&amp; sock = ssl_sock.lowest_layer();
sock.connect(my_endpoint);
</pre>
<p>
In some use cases the underlying stream object will need to have a longer
lifetime than the SSL stream, in which case the template parameter should
be a reference to the stream type:
</p>
<pre class="programlisting">ip::tcp::socket sock(my_io_context);
ssl::stream&lt;ip::tcp::socket&amp;&gt; ssl_sock(sock, ctx);
</pre>
<p>
SSL handshaking must be performed prior to transmitting or receiving data
over an encrypted connection. This is accomplished using the <code class="computeroutput">ssl::stream</code>
template's <a class="link" href="../reference/ssl__stream/handshake.html" title="ssl::stream::handshake">handshake()</a>
or <a class="link" href="../reference/ssl__stream/async_handshake.html" title="ssl::stream::async_handshake">async_handshake()</a>
member functions.
</p>
<p>
Once connected, SSL stream objects are used as synchronous or asynchronous
read and write streams. This means the objects can be used with any of the
<a class="link" href="../reference/read.html" title="read">read()</a>, <a class="link" href="../reference/async_read.html" title="async_read">async_read()</a>,
<a class="link" href="../reference/write.html" title="write">write()</a>, <a class="link" href="../reference/async_write.html" title="async_write">async_write()</a>,
<a class="link" href="../reference/read_until.html" title="read_until">read_until()</a> or <a class="link" href="../reference/async_read_until.html" title="async_read_until">async_read_until()</a>
free functions.
</p>
<h5>
<a name="asio.overview.ssl.h0"></a>
<span><a name="asio.overview.ssl.certificate_verification"></a></span><a class="link" href="ssl.html#asio.overview.ssl.certificate_verification">Certificate
Verification</a>
</h5>
<p>
Asio provides various methods for configuring the way SSL certificates are
verified:
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem">
<a class="link" href="../reference/ssl__context/set_default_verify_paths.html" title="ssl::context::set_default_verify_paths">ssl::context::set_default_verify_paths()</a>
</li>
<li class="listitem">
<a class="link" href="../reference/ssl__context/set_verify_mode.html" title="ssl::context::set_verify_mode">ssl::context::set_verify_mode()</a>
</li>
<li class="listitem">
<a class="link" href="../reference/ssl__context/set_verify_callback.html" title="ssl::context::set_verify_callback">ssl::context::set_verify_callback()</a>
</li>
<li class="listitem">
<a class="link" href="../reference/ssl__context/load_verify_file.html" title="ssl::context::load_verify_file">ssl::context::load_verify_file()</a>
</li>
<li class="listitem">
<a class="link" href="../reference/ssl__stream/set_verify_mode.html" title="ssl::stream::set_verify_mode">ssl::stream::set_verify_mode()</a>
</li>
<li class="listitem">
<a class="link" href="../reference/ssl__stream/set_verify_callback.html" title="ssl::stream::set_verify_callback">ssl::stream::set_verify_callback()</a>
</li>
</ul></div>
<p>
To simplify use cases where certificates are verified according to the rules
in RFC 6125 (identity verification in the context of Transport Layer Security),
Asio provides a reusable verification callback as a function object:
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
<a class="link" href="../reference/ssl__host_name_verification.html" title="ssl::host_name_verification">ssl::host_name_verification</a>
</li></ul></div>
<p>
The following example shows verification of a remote host's certificate according
to the rules used by HTTPS:
</p>
<pre class="programlisting">using asio::ip::tcp;
namespace ssl = asio::ssl;
typedef ssl::stream&lt;tcp::socket&gt; ssl_socket;
// Create a context that uses the default paths for
// finding CA certificates.
ssl::context ctx(ssl::context::sslv23);
ctx.set_default_verify_paths();
// Open a socket and connect it to the remote host.
asio::io_context io_context;
ssl_socket sock(io_context, ctx);
tcp::resolver resolver(io_context);
tcp::resolver::query query("host.name", "https");
asio::connect(sock.lowest_layer(), resolver.resolve(query));
sock.lowest_layer().set_option(tcp::no_delay(true));
// Perform SSL handshake and verify the remote host's
// certificate.
sock.set_verify_mode(ssl::verify_peer);
sock.set_verify_callback(ssl::host_name_verification("host.name"));
sock.handshake(ssl_socket::client);
// ... read and write as normal ...
</pre>
<h5>
<a name="asio.overview.ssl.h1"></a>
<span><a name="asio.overview.ssl.ssl_and_threads"></a></span><a class="link" href="ssl.html#asio.overview.ssl.ssl_and_threads">SSL
and Threads</a>
</h5>
<p>
SSL stream objects perform no locking of their own. Therefore, it is essential
that all asynchronous SSL operations are performed in an implicit or explicit
<a class="link" href="core/strands.html" title="Strands: Use Threads Without Explicit Locking">strand</a>. Note that this
means that no synchronisation is required (and so no locking overhead is
incurred) in single threaded programs.
</p>
<h5>
<a name="asio.overview.ssl.h2"></a>
<span><a name="asio.overview.ssl.see_also"></a></span><a class="link" href="ssl.html#asio.overview.ssl.see_also">See
Also</a>
</h5>
<p>
<a class="link" href="../reference/ssl__context.html" title="ssl::context">ssl::context</a>, <a class="link" href="../reference/ssl__host_name_verification.html" title="ssl::host_name_verification">ssl::host_name_verification</a>,
<a class="link" href="../reference/ssl__stream.html" title="ssl::stream">ssl::stream</a>, <a class="link" href="../examples/cpp03_examples.html#asio.examples.cpp03_examples.ssl">SSL
example (C++03)</a>, <a class="link" href="../examples/cpp11_examples.html#asio.examples.cpp11_examples.ssl">SSL
example (C++11)</a>.
</p>
<h5>
<a name="asio.overview.ssl.h3"></a>
<span><a name="asio.overview.ssl.notes"></a></span><a class="link" href="ssl.html#asio.overview.ssl.notes">Notes</a>
</h5>
<p>
<a href="http://www.openssl.org" target="_top">OpenSSL</a> is required to make use
of Asio's SSL support. When an application needs to use OpenSSL functionality
that is not wrapped by Asio, the underlying OpenSSL types may be obtained
by calling <a class="link" href="../reference/ssl__context/native_handle.html" title="ssl::context::native_handle"><code class="computeroutput">ssl::context::native_handle()</code></a>
or <a class="link" href="../reference/ssl__stream/native_handle.html" title="ssl::stream::native_handle"><code class="computeroutput">ssl::stream::native_handle()</code></a>.
</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-2020 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="windows/object_handle.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../overview.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="cpp2011.html"><img src="../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,87 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Timers</title>
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../index.html" title="Asio">
<link rel="up" href="../overview.html" title="Overview">
<link rel="prev" href="networking/bsd_sockets.html" title="The BSD Socket API and Asio">
<link rel="next" href="serial_ports.html" title="Serial Ports">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="networking/bsd_sockets.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../overview.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="serial_ports.html"><img src="../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="asio.overview.timers"></a><a class="link" href="timers.html" title="Timers">Timers</a>
</h3></div></div></div>
<p>
Long running I/O operations will often have a deadline by which they must
have completed. These deadlines may be expressed as absolute times, but are
often calculated relative to the current time.
</p>
<p>
As a simple example, to perform a synchronous wait operation on a timer using
a relative time one may write:
</p>
<pre class="programlisting">io_context i;
...
deadline_timer t(i);
t.expires_from_now(boost::posix_time::seconds(5));
t.wait();
</pre>
<p>
More commonly, a program will perform an asynchronous wait operation on a
timer:
</p>
<pre class="programlisting">void handler(asio::error_code ec) { ... }
...
io_context i;
...
deadline_timer t(i);
t.expires_from_now(boost::posix_time::milliseconds(400));
t.async_wait(handler);
...
i.run();
</pre>
<p>
The deadline associated with a timer may also be obtained as a relative time:
</p>
<pre class="programlisting">boost::posix_time::time_duration time_until_expiry
= t.expires_from_now();
</pre>
<p>
or as an absolute time to allow composition of timers:
</p>
<pre class="programlisting">deadline_timer t2(i);
t2.expires_at(t.expires_at() + boost::posix_time::seconds(30));
</pre>
<h5>
<a name="asio.overview.timers.h0"></a>
<span><a name="asio.overview.timers.see_also"></a></span><a class="link" href="timers.html#asio.overview.timers.see_also">See
Also</a>
</h5>
<p>
<a class="link" href="../reference/basic_deadline_timer.html" title="basic_deadline_timer">basic_deadline_timer</a>,
<a class="link" href="../reference/deadline_timer.html" title="deadline_timer">deadline_timer</a>, <a class="link" href="../tutorial/tuttimer1.html" title="Timer.1 - Using a timer synchronously">timer tutorials</a>.
</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-2020 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="networking/bsd_sockets.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../overview.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="serial_ports.html"><img src="../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,47 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Windows-Specific Functionality</title>
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../index.html" title="Asio">
<link rel="up" href="../overview.html" title="Overview">
<link rel="prev" href="posix/fork.html" title="Fork">
<link rel="next" href="windows/stream_handle.html" title="Stream-Oriented HANDLEs">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="posix/fork.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../overview.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="windows/stream_handle.html"><img src="../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="asio.overview.windows"></a><a class="link" href="windows.html" title="Windows-Specific Functionality">Windows-Specific Functionality</a>
</h3></div></div></div>
<p>
<a class="link" href="windows/stream_handle.html" title="Stream-Oriented HANDLEs">Stream-Oriented HANDLEs</a>
</p>
<p>
<a class="link" href="windows/random_access_handle.html" title="Random-Access HANDLEs">Random-Access
HANDLEs</a>
</p>
<p>
<a class="link" href="windows/object_handle.html" title="Object HANDLEs">Object HANDLEs</a>
</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-2020 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="posix/fork.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../overview.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="windows/stream_handle.html"><img src="../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,95 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Object HANDLEs</title>
<link rel="stylesheet" href="../../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../../index.html" title="Asio">
<link rel="up" href="../windows.html" title="Windows-Specific Functionality">
<link rel="prev" href="random_access_handle.html" title="Random-Access HANDLEs">
<link rel="next" href="../ssl.html" title="SSL">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="random_access_handle.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../windows.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="../ssl.html"><img src="../../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h4 class="title">
<a name="asio.overview.windows.object_handle"></a><a class="link" href="object_handle.html" title="Object HANDLEs">Object HANDLEs</a>
</h4></div></div></div>
<p>
Asio provides Windows-specific classes that permit asynchronous wait operations
to be performed on HANDLEs to kernel objects of the following types:
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem">
Change notification
</li>
<li class="listitem">
Console input
</li>
<li class="listitem">
Event
</li>
<li class="listitem">
Memory resource notification
</li>
<li class="listitem">
Process
</li>
<li class="listitem">
Semaphore
</li>
<li class="listitem">
Thread
</li>
<li class="listitem">
Waitable timer
</li>
</ul></div>
<p>
For example, to perform asynchronous operations on an event, the following
object may be created:
</p>
<pre class="programlisting">HANDLE handle = ::CreateEvent(...);
windows::object_handle file(my_io_context, handle);
</pre>
<p>
The <code class="computeroutput">wait()</code> and <code class="computeroutput">async_wait()</code> member functions
may then be used to wait until the kernel object is signalled.
</p>
<h6>
<a name="asio.overview.windows.object_handle.h0"></a>
<span><a name="asio.overview.windows.object_handle.see_also"></a></span><a class="link" href="object_handle.html#asio.overview.windows.object_handle.see_also">See
Also</a>
</h6>
<p>
<a class="link" href="../../reference/windows__object_handle.html" title="windows::object_handle">windows::object_handle</a>.
</p>
<h6>
<a name="asio.overview.windows.object_handle.h1"></a>
<span><a name="asio.overview.windows.object_handle.notes"></a></span><a class="link" href="object_handle.html#asio.overview.windows.object_handle.notes">Notes</a>
</h6>
<p>
Windows object <code class="computeroutput">HANDLE</code>s are only available at compile time
when targeting Windows. Programs may test for the macro <code class="computeroutput">ASIO_HAS_WINDOWS_OBJECT_HANDLE</code>
to determine whether they are supported.
</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-2020 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="random_access_handle.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../windows.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="../ssl.html"><img src="../../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,76 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Random-Access HANDLEs</title>
<link rel="stylesheet" href="../../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../../index.html" title="Asio">
<link rel="up" href="../windows.html" title="Windows-Specific Functionality">
<link rel="prev" href="stream_handle.html" title="Stream-Oriented HANDLEs">
<link rel="next" href="object_handle.html" title="Object HANDLEs">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="stream_handle.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../windows.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="object_handle.html"><img src="../../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h4 class="title">
<a name="asio.overview.windows.random_access_handle"></a><a class="link" href="random_access_handle.html" title="Random-Access HANDLEs">Random-Access
HANDLEs</a>
</h4></div></div></div>
<p>
Asio provides Windows-specific classes that permit asynchronous read and
write operations to be performed on HANDLEs that refer to regular files.
</p>
<p>
For example, to perform asynchronous operations on a file the following
object may be created:
</p>
<pre class="programlisting">HANDLE handle = ::CreateFile(...);
windows::random_access_handle file(my_io_context, handle);
</pre>
<p>
Data may be read from or written to the handle using one of the <code class="computeroutput">read_some_at()</code>,
<code class="computeroutput">async_read_some_at()</code>, <code class="computeroutput">write_some_at()</code> or <code class="computeroutput">async_write_some_at()</code>
member functions. However, like the equivalent functions (<code class="computeroutput">read_some()</code>,
etc.) on streams, these functions are only required to transfer one or
more bytes in a single operation. Therefore free functions called <a class="link" href="../../reference/read_at.html" title="read_at">read_at()</a>, <a class="link" href="../../reference/async_read_at.html" title="async_read_at">async_read_at()</a>,
<a class="link" href="../../reference/write_at.html" title="write_at">write_at()</a> and <a class="link" href="../../reference/async_write_at.html" title="async_write_at">async_write_at()</a>
have been created to repeatedly call the corresponding <code class="literal"><span class="bold"><strong>*</strong></span>_some_at()</code> function until all data has
been transferred.
</p>
<h6>
<a name="asio.overview.windows.random_access_handle.h0"></a>
<span><a name="asio.overview.windows.random_access_handle.see_also"></a></span><a class="link" href="random_access_handle.html#asio.overview.windows.random_access_handle.see_also">See Also</a>
</h6>
<p>
<a class="link" href="../../reference/windows__random_access_handle.html" title="windows::random_access_handle">windows::random_access_handle</a>.
</p>
<h6>
<a name="asio.overview.windows.random_access_handle.h1"></a>
<span><a name="asio.overview.windows.random_access_handle.notes"></a></span><a class="link" href="random_access_handle.html#asio.overview.windows.random_access_handle.notes">Notes</a>
</h6>
<p>
Windows random-access <code class="computeroutput">HANDLE</code>s are only available at compile
time when targeting Windows and only when the I/O completion port backend
is used (which is the default). A program may test for the macro <code class="computeroutput">ASIO_HAS_WINDOWS_RANDOM_ACCESS_HANDLE</code>
to determine whether they are supported.
</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-2020 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="stream_handle.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../windows.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="object_handle.html"><img src="../../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,79 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Stream-Oriented HANDLEs</title>
<link rel="stylesheet" href="../../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../../index.html" title="Asio">
<link rel="up" href="../windows.html" title="Windows-Specific Functionality">
<link rel="prev" href="../windows.html" title="Windows-Specific Functionality">
<link rel="next" href="random_access_handle.html" title="Random-Access HANDLEs">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="../windows.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../windows.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="random_access_handle.html"><img src="../../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h4 class="title">
<a name="asio.overview.windows.stream_handle"></a><a class="link" href="stream_handle.html" title="Stream-Oriented HANDLEs">Stream-Oriented
HANDLEs</a>
</h4></div></div></div>
<p>
Asio contains classes to allow asynchronous read and write operations to
be performed on Windows <code class="computeroutput">HANDLE</code>s, such as named pipes.
</p>
<p>
For example, to perform asynchronous operations on a named pipe, the following
object may be created:
</p>
<pre class="programlisting">HANDLE handle = ::CreateFile(...);
windows::stream_handle pipe(my_io_context, handle);
</pre>
<p>
These are then used as synchronous or asynchronous read and write streams.
This means the objects can be used with any of the <a class="link" href="../../reference/read.html" title="read">read()</a>,
<a class="link" href="../../reference/async_read.html" title="async_read">async_read()</a>, <a class="link" href="../../reference/write.html" title="write">write()</a>,
<a class="link" href="../../reference/async_write.html" title="async_write">async_write()</a>, <a class="link" href="../../reference/read_until.html" title="read_until">read_until()</a> or <a class="link" href="../../reference/async_read_until.html" title="async_read_until">async_read_until()</a>
free functions.
</p>
<p>
The kernel object referred to by the <code class="computeroutput">HANDLE</code> must support use
with I/O completion ports (which means that named pipes are supported,
but anonymous pipes and console streams are not).
</p>
<h6>
<a name="asio.overview.windows.stream_handle.h0"></a>
<span><a name="asio.overview.windows.stream_handle.see_also"></a></span><a class="link" href="stream_handle.html#asio.overview.windows.stream_handle.see_also">See
Also</a>
</h6>
<p>
<a class="link" href="../../reference/windows__stream_handle.html" title="windows::stream_handle">windows::stream_handle</a>.
</p>
<h6>
<a name="asio.overview.windows.stream_handle.h1"></a>
<span><a name="asio.overview.windows.stream_handle.notes"></a></span><a class="link" href="stream_handle.html#asio.overview.windows.stream_handle.notes">Notes</a>
</h6>
<p>
Windows stream <code class="computeroutput">HANDLE</code>s are only available at compile time
when targeting Windows and only when the I/O completion port backend is
used (which is the default). A program may test for the macro <code class="computeroutput">ASIO_HAS_WINDOWS_STREAM_HANDLE</code>
to determine whether they are supported.
</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-2020 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="../windows.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../windows.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="random_access_handle.html"><img src="../../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,788 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Reference</title>
<link rel="stylesheet" href="../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../index.html" title="Asio">
<link rel="up" href="../index.html" title="Asio">
<link rel="prev" href="examples/cpp17_examples.html" title="C++17 Examples">
<link rel="next" href="reference/asynchronous_operations.html" title="Requirements on asynchronous operations">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="examples/cpp17_examples.html"><img src="../prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../home.png" alt="Home"></a><a accesskey="n" href="reference/asynchronous_operations.html"><img src="../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
<a name="asio.reference"></a><a class="link" href="reference.html" title="Reference">Reference</a>
</h2></div></div></div>
<div class="informaltable">
<table class="table">
<colgroup>
<col>
<col>
<col>
<col>
</colgroup>
<thead><tr>
<th valign="center">
<h3>
<a name="idm424582793728"></a>Properties</h3>
</th>
<th colspan="3" valign="center">
<h3>
<a name="idm424582792032"></a>Execution</h3>
</th>
</tr></thead>
<tbody><tr>
<td valign="top">
<h4>
<a name="idm424582790016"></a>Customisation Points</h4>
<table border="0" summary="Simple list" class="simplelist">
<tr><td><a class="link" href="reference/prefer.html" title="prefer">prefer</a></td></tr>
<tr><td><a class="link" href="reference/query.html" title="query">query</a></td></tr>
<tr><td><a class="link" href="reference/require.html" title="require">require</a></td></tr>
<tr><td><a class="link" href="reference/require_concept.html" title="require_concept">require_concept</a></td></tr>
</table>
<h4>
<a name="idm424582784432"></a>Traits</h4>
<table border="0" summary="Simple list" class="simplelist">
<tr><td><a class="link" href="reference/can_prefer.html" title="can_prefer">can_prefer</a></td></tr>
<tr><td><a class="link" href="reference/can_query.html" title="can_query">can_query</a></td></tr>
<tr><td><a class="link" href="reference/can_require.html" title="can_require">can_require</a></td></tr>
<tr><td><a class="link" href="reference/can_require_concept.html" title="can_require_concept">can_require_concept</a></td></tr>
<tr><td><a class="link" href="reference/is_nothrow_prefer.html" title="is_nothrow_prefer">is_nothrow_prefer</a></td></tr>
<tr><td><a class="link" href="reference/is_nothrow_query.html" title="is_nothrow_query">is_nothrow_query</a></td></tr>
<tr><td><a class="link" href="reference/is_nothrow_require.html" title="is_nothrow_require">is_nothrow_require</a></td></tr>
<tr><td><a class="link" href="reference/is_nothrow_require_concept.html" title="is_nothrow_require_concept">is_nothrow_require_concept</a></td></tr>
<tr><td><a class="link" href="reference/prefer_result.html" title="prefer_result">prefer_result</a></td></tr>
<tr><td><a class="link" href="reference/query_result.html" title="query_result">query_result</a></td></tr>
<tr><td><a class="link" href="reference/require_result.html" title="require_result">require_result</a></td></tr>
<tr><td><a class="link" href="reference/require_concept_result.html" title="require_concept_result">require_concept_result</a></td></tr>
</table>
</td>
<td valign="top">
<h4>
<a name="idm424582769840"></a>Class Templates</h4>
<table border="0" summary="Simple list" class="simplelist"><tr><td><a class="link" href="reference/execution__any_executor.html" title="execution::any_executor">execution::any_executor</a></td></tr></table>
<h4>
<a name="idm424582767264"></a>Classes</h4>
<table border="0" summary="Simple list" class="simplelist">
<tr><td><a class="link" href="reference/execution__bad_executor.html" title="execution::bad_executor">execution::bad_executor</a></td></tr>
<tr><td><a class="link" href="reference/execution__invocable_archetype.html" title="execution::invocable_archetype">execution::invocable_archetype</a></td></tr>
<tr><td><a class="link" href="reference/execution__receiver_invocation_error.html" title="execution::receiver_invocation_error">execution::receiver_invocation_error</a></td></tr>
</table>
<h4>
<a name="idm424582762448"></a>Properties</h4>
<table border="0" summary="Simple list" class="simplelist">
<tr><td><a class="link" href="reference/execution__allocator_t.html" title="execution::allocator_t">execution::allocator_t</a></td></tr>
<tr><td><a class="link" href="reference/execution__blocking_t.html" title="execution::blocking_t">execution::blocking_t</a></td></tr>
<tr><td><a class="link" href="reference/execution__blocking_t__possibly_t.html" title="execution::blocking_t::possibly_t">execution::blocking_t::possibly_t</a></td></tr>
<tr><td><a class="link" href="reference/execution__blocking_t__always_t.html" title="execution::blocking_t::always_t">execution::blocking_t::always_t</a></td></tr>
<tr><td><a class="link" href="reference/execution__blocking_t__never_t.html" title="execution::blocking_t::never_t">execution::blocking_t::never_t</a></td></tr>
<tr><td><a class="link" href="reference/execution__blocking_adaptation_t.html" title="execution::blocking_adaptation_t">execution::blocking_adaptation_t</a></td></tr>
<tr><td><a class="link" href="reference/execution__blocking_adaptation_t__disallowed_t.html" title="execution::blocking_adaptation_t::disallowed_t">execution::blocking_adaptation_t::disallowed_t</a></td></tr>
<tr><td><a class="link" href="reference/execution__blocking_adaptation_t__allowed_t.html" title="execution::blocking_adaptation_t::allowed_t">execution::blocking_adaptation_t::allowed_t</a></td></tr>
<tr><td><a class="link" href="reference/execution__bulk_guarantee_t.html" title="execution::bulk_guarantee_t">execution::bulk_guarantee_t</a></td></tr>
<tr><td><a class="link" href="reference/execution__bulk_guarantee_t__unsequenced_t.html" title="execution::bulk_guarantee_t::unsequenced_t">execution::bulk_guarantee_t::unsequenced_t</a></td></tr>
<tr><td><a class="link" href="reference/execution__bulk_guarantee_t__sequenced_t.html" title="execution::bulk_guarantee_t::sequenced_t">execution::bulk_guarantee_t::sequenced_t</a></td></tr>
<tr><td><a class="link" href="reference/execution__bulk_guarantee_t__parallel_t.html" title="execution::bulk_guarantee_t::parallel_t">execution::bulk_guarantee_t::parallel_t</a></td></tr>
<tr><td><a class="link" href="reference/execution__context_t.html" title="execution::context_t">execution::context_t</a></td></tr>
<tr><td><a class="link" href="reference/execution__context_as_t.html" title="execution::context_as_t">execution::context_as_t</a></td></tr>
<tr><td><a class="link" href="reference/execution__mapping_t.html" title="execution::mapping_t">execution::mapping_t</a></td></tr>
<tr><td><a class="link" href="reference/execution__mapping_t__thread_t.html" title="execution::mapping_t::thread_t">execution::mapping_t::thread_t</a></td></tr>
<tr><td><a class="link" href="reference/execution__mapping_t__new_thread_t.html" title="execution::mapping_t::new_thread_t">execution::mapping_t::new_thread_t</a></td></tr>
<tr><td><a class="link" href="reference/execution__mapping_t__other_t.html" title="execution::mapping_t::other_t">execution::mapping_t::other_t</a></td></tr>
<tr><td><a class="link" href="reference/execution__occupancy_t.html" title="execution::occupancy_t">execution::occupancy_t</a></td></tr>
<tr><td><a class="link" href="reference/execution__outstanding_work_t.html" title="execution::outstanding_work_t">execution::outstanding_work_t</a></td></tr>
<tr><td><a class="link" href="reference/execution__outstanding_work_t__untracked_t.html" title="execution::outstanding_work_t::untracked_t">execution::outstanding_work_t::untracked_t</a></td></tr>
<tr><td><a class="link" href="reference/execution__outstanding_work_t__tracked_t.html" title="execution::outstanding_work_t::tracked_t">execution::outstanding_work_t::tracked_t</a></td></tr>
<tr><td><a class="link" href="reference/execution__prefer_only.html" title="execution::prefer_only">execution::prefer_only</a></td></tr>
<tr><td><a class="link" href="reference/execution__relationship_t.html" title="execution::relationship_t">execution::relationship_t</a></td></tr>
<tr><td><a class="link" href="reference/execution__relationship_t__fork_t.html" title="execution::relationship_t::fork_t">execution::relationship_t::fork_t</a></td></tr>
<tr><td><a class="link" href="reference/execution__relationship_t__continuation_t.html" title="execution::relationship_t::continuation_t">execution::relationship_t::continuation_t</a></td></tr>
</table>
</td>
<td valign="top">
<h4>
<a name="idm424582731952"></a>Customisation Points</h4>
<table border="0" summary="Simple list" class="simplelist">
<tr><td><a class="link" href="reference/execution__bulk_execute.html" title="execution::bulk_execute">execution::bulk_execute</a></td></tr>
<tr><td><a class="link" href="reference/execution__connect.html" title="execution::connect">execution::connect</a></td></tr>
<tr><td><a class="link" href="reference/execution__execute.html" title="execution::execute">execution::execute</a></td></tr>
<tr><td><a class="link" href="reference/execution__schedule.html" title="execution::schedule">execution::schedule</a></td></tr>
<tr><td><a class="link" href="reference/execution__set_done.html" title="execution::set_done">execution::set_done</a></td></tr>
<tr><td><a class="link" href="reference/execution__set_error.html" title="execution::set_error">execution::set_error</a></td></tr>
<tr><td><a class="link" href="reference/execution__set_value.html" title="execution::set_value">execution::set_value</a></td></tr>
<tr><td><a class="link" href="reference/execution__start.html" title="execution::start">execution::start</a></td></tr>
<tr><td><a class="link" href="reference/execution__submit.html" title="execution::submit">execution::submit</a></td></tr>
</table>
<h4>
<a name="idm424582720784"></a>Property Objects</h4>
<table border="0" summary="Simple list" class="simplelist">
<tr><td><a class="link" href="reference/execution__allocator.html" title="execution::allocator">execution::allocator</a></td></tr>
<tr><td><a class="link" href="reference/execution__blocking.html" title="execution::blocking">execution::blocking</a></td></tr>
<tr><td><a class="link" href="reference/execution__blocking_t/possibly.html" title="execution::blocking_t::possibly">execution::blocking.possibly</a></td></tr>
<tr><td><a class="link" href="reference/execution__blocking_t/always.html" title="execution::blocking_t::always">execution::blocking.always</a></td></tr>
<tr><td><a class="link" href="reference/execution__blocking_t/never.html" title="execution::blocking_t::never">execution::blocking.never</a></td></tr>
<tr><td><a class="link" href="reference/execution__blocking_adaptation.html" title="execution::blocking_adaptation">execution::blocking_adaptation</a></td></tr>
<tr><td><a class="link" href="reference/execution__blocking_adaptation_t/disallowed.html" title="execution::blocking_adaptation_t::disallowed">execution::blocking_adaptation.disallowed</a></td></tr>
<tr><td><a class="link" href="reference/execution__blocking_adaptation_t/allowed.html" title="execution::blocking_adaptation_t::allowed">execution::blocking_adaptation.allowed</a></td></tr>
<tr><td><a class="link" href="reference/execution__bulk_guarantee.html" title="execution::bulk_guarantee">execution::bulk_guarantee</a></td></tr>
<tr><td><a class="link" href="reference/execution__bulk_guarantee_t/unsequenced.html" title="execution::bulk_guarantee_t::unsequenced">execution::bulk_guarantee.unsequenced</a></td></tr>
<tr><td><a class="link" href="reference/execution__bulk_guarantee_t/sequenced.html" title="execution::bulk_guarantee_t::sequenced">execution::bulk_guarantee.sequenced</a></td></tr>
<tr><td><a class="link" href="reference/execution__bulk_guarantee_t/parallel.html" title="execution::bulk_guarantee_t::parallel">execution::bulk_guarantee.parallel</a></td></tr>
<tr><td><a class="link" href="reference/execution__context.html" title="execution::context">execution::context</a></td></tr>
<tr><td><a class="link" href="reference/execution__context_as.html" title="execution::context_as">execution::context_as</a></td></tr>
<tr><td><a class="link" href="reference/execution__mapping.html" title="execution::mapping">execution::mapping</a></td></tr>
<tr><td><a class="link" href="reference/execution__mapping_t/thread.html" title="execution::mapping_t::thread">execution::mapping.thread</a></td></tr>
<tr><td><a class="link" href="reference/execution__mapping_t/new_thread.html" title="execution::mapping_t::new_thread">execution::mapping.new_thread</a></td></tr>
<tr><td><a class="link" href="reference/execution__mapping_t/other.html" title="execution::mapping_t::other">execution::mapping.other</a></td></tr>
<tr><td><a class="link" href="reference/execution__occupancy.html" title="execution::occupancy">execution::occupancy</a></td></tr>
<tr><td><a class="link" href="reference/execution__outstanding_work.html" title="execution::outstanding_work">execution::outstanding_work</a></td></tr>
<tr><td><a class="link" href="reference/execution__outstanding_work_t/untracked.html" title="execution::outstanding_work_t::untracked">execution::outstanding_work.untracked</a></td></tr>
<tr><td><a class="link" href="reference/execution__outstanding_work_t/tracked.html" title="execution::outstanding_work_t::tracked">execution::outstanding_work.tracked</a></td></tr>
<tr><td><a class="link" href="reference/execution__relationship.html" title="execution::relationship">execution::relationship</a></td></tr>
<tr><td><a class="link" href="reference/execution__relationship_t/fork.html" title="execution::relationship_t::fork">execution::relationship.fork</a></td></tr>
<tr><td><a class="link" href="reference/execution__relationship_t/continuation.html" title="execution::relationship_t::continuation">execution::relationship.continuation</a></td></tr>
</table>
</td>
<td valign="top">
<h4>
<a name="idm424582691488"></a>Type Traits</h4>
<table border="0" summary="Simple list" class="simplelist">
<tr><td><a class="link" href="reference/execution__can_bulk_execute.html" title="execution::can_bulk_execute">execution::can_bulk_execute</a></td></tr>
<tr><td><a class="link" href="reference/execution__can_connect.html" title="execution::can_connect">execution::can_connect</a></td></tr>
<tr><td><a class="link" href="reference/execution__can_execute.html" title="execution::can_execute">execution::can_execute</a></td></tr>
<tr><td><a class="link" href="reference/execution__can_schedule.html" title="execution::can_schedule">execution::can_schedule</a></td></tr>
<tr><td><a class="link" href="reference/execution__can_set_done.html" title="execution::can_set_done">execution::can_set_done</a></td></tr>
<tr><td><a class="link" href="reference/execution__can_set_error.html" title="execution::can_set_error">execution::can_set_error</a></td></tr>
<tr><td><a class="link" href="reference/execution__can_set_value.html" title="execution::can_set_value">execution::can_set_value</a></td></tr>
<tr><td><a class="link" href="reference/execution__can_start.html" title="execution::can_start">execution::can_start</a></td></tr>
<tr><td><a class="link" href="reference/execution__can_submit.html" title="execution::can_submit">execution::can_submit</a></td></tr>
<tr><td><a class="link" href="reference/execution__connect_result.html" title="execution::connect_result">execution::connect_result</a></td></tr>
<tr><td><a class="link" href="reference/execution__is_executor.html" title="execution::is_executor">execution::is_executor</a></td></tr>
<tr><td><a class="link" href="reference/execution__is_executor_of.html" title="execution::is_executor_of">execution::is_executor_of</a></td></tr>
<tr><td><a class="link" href="reference/execution__is_nothrow_receiver_of.html" title="execution::is_nothrow_receiver_of">execution::is_nothrow_receiver_of</a></td></tr>
<tr><td><a class="link" href="reference/execution__is_receiver.html" title="execution::is_receiver">execution::is_receiver</a></td></tr>
<tr><td><a class="link" href="reference/execution__is_receiver_of.html" title="execution::is_receiver_of">execution::is_receiver_of</a></td></tr>
<tr><td><a class="link" href="reference/execution__is_sender.html" title="execution::is_sender">execution::is_sender</a></td></tr>
<tr><td><a class="link" href="reference/execution__is_sender_to.html" title="execution::is_sender_to">execution::is_sender_to</a></td></tr>
<tr><td><a class="link" href="reference/execution__is_typed_sender.html" title="execution::is_typed_sender">execution::is_typed_sender</a></td></tr>
<tr><td><a class="link" href="reference/execution__sender_traits.html" title="execution::sender_traits">execution::sender_traits</a></td></tr>
</table>
<h4>
<a name="idm424582669568"></a>Concepts</h4>
<table border="0" summary="Simple list" class="simplelist">
<tr><td><a class="link" href="reference/Executor1.html#asio.reference.Executor1.standard_executors">executor</a></td></tr>
<tr><td><a class="link" href="reference/Executor1.html#asio.reference.Executor1.standard_executors">executor_of</a></td></tr>
<tr><td><a class="link" href="reference/OperationState.html" title="Operation state concept">operation_state</a></td></tr>
<tr><td><a class="link" href="reference/Receiver.html" title="Receiver concepts">receiver</a></td></tr>
<tr><td><a class="link" href="reference/Receiver.html" title="Receiver concepts">receiver_of</a></td></tr>
<tr><td><a class="link" href="reference/Scheduler.html" title="Scheduler concept">scheduler</a></td></tr>
<tr><td><a class="link" href="reference/Sender.html" title="Sender concepts">sender</a></td></tr>
<tr><td><a class="link" href="reference/Sender.html" title="Sender concepts">sender_to</a></td></tr>
<tr><td><a class="link" href="reference/Sender.html#asio.reference.Sender.typed_sender">typed_sender</a></td></tr>
</table>
</td>
</tr></tbody>
</table>
<table class="table">
<colgroup>
<col>
<col>
<col>
<col>
</colgroup>
<thead><tr><th colspan="4" valign="center">
<h3>
<a name="idm424582654800"></a>Core</h3>
</th></tr></thead>
<tbody><tr>
<td valign="top">
<h4>
<a name="idm424582652784"></a>Classes</h4>
<table border="0" summary="Simple list" class="simplelist">
<tr><td><a class="link" href="reference/any_io_executor.html" title="any_io_executor">any_io_executor</a></td></tr>
<tr><td><a class="link" href="reference/bad_executor.html" title="bad_executor">bad_executor</a></td></tr>
<tr><td><a class="link" href="reference/coroutine.html" title="coroutine">coroutine</a></td></tr>
<tr><td><a class="link" href="reference/detached_t.html" title="detached_t">detached_t</a></td></tr>
<tr><td><a class="link" href="reference/error_code.html" title="error_code">error_code</a></td></tr>
<tr><td><a class="link" href="reference/execution_context.html" title="execution_context">execution_context</a></td></tr>
<tr><td><a class="link" href="reference/execution_context__id.html" title="execution_context::id">execution_context::id</a></td></tr>
<tr><td><a class="link" href="reference/execution_context__service.html" title="execution_context::service">execution_context::service</a></td></tr>
<tr><td><a class="link" href="reference/executor.html" title="executor">executor</a></td></tr>
<tr><td><a class="link" href="reference/executor_arg_t.html" title="executor_arg_t">executor_arg_t</a></td></tr>
<tr><td><a class="link" href="reference/invalid_service_owner.html" title="invalid_service_owner">invalid_service_owner</a></td></tr>
<tr><td><a class="link" href="reference/io_context.html" title="io_context">io_context</a></td></tr>
<tr><td><a class="link" href="reference/io_context/executor_type.html" title="io_context::executor_type">io_context::executor_type</a></td></tr>
<tr><td><a class="link" href="reference/io_context__service.html" title="io_context::service">io_context::service</a></td></tr>
<tr><td><a class="link" href="reference/io_context__strand.html" title="io_context::strand">io_context::strand</a></td></tr>
<tr><td>
<a class="link" href="reference/io_context__work.html" title="io_context::work">io_context::work</a> (deprecated)</td></tr>
<tr><td><a class="link" href="reference/multiple_exceptions.html" title="multiple_exceptions">multiple_exceptions</a></td></tr>
<tr><td><a class="link" href="reference/service_already_exists.html" title="service_already_exists">service_already_exists</a></td></tr>
<tr><td><a class="link" href="reference/static_thread_pool.html" title="static_thread_pool">static_thread_pool</a></td></tr>
<tr><td><a class="link" href="reference/system_context.html" title="system_context">system_context</a></td></tr>
<tr><td><a class="link" href="reference/system_error.html" title="system_error">system_error</a></td></tr>
<tr><td><a class="link" href="reference/system_executor.html" title="system_executor">system_executor</a></td></tr>
<tr><td><a class="link" href="reference/this_coro__executor_t.html" title="this_coro::executor_t">this_coro::executor_t</a></td></tr>
<tr><td><a class="link" href="reference/thread.html" title="thread">thread</a></td></tr>
<tr><td><a class="link" href="reference/thread_pool.html" title="thread_pool">thread_pool</a></td></tr>
<tr><td><a class="link" href="reference/thread_pool/executor_type.html" title="thread_pool::executor_type">thread_pool::executor_type</a></td></tr>
<tr><td><a class="link" href="reference/yield_context.html" title="yield_context">yield_context</a></td></tr>
</table>
</td>
<td valign="top">
<h4>
<a name="idm424582623424"></a>Free Functions</h4>
<table border="0" summary="Simple list" class="simplelist">
<tr><td><a class="link" href="reference/execution_context/add_service.html" title="execution_context::add_service">add_service</a></td></tr>
<tr><td>
<a class="link" href="reference/asio_handler_allocate.html" title="asio_handler_allocate">asio_handler_allocate</a> (deprecated)</td></tr>
<tr><td>
<a class="link" href="reference/asio_handler_deallocate.html" title="asio_handler_deallocate">asio_handler_deallocate</a> (deprecated)</td></tr>
<tr><td>
<a class="link" href="reference/asio_handler_invoke.html" title="asio_handler_invoke">asio_handler_invoke</a> (deprecated)</td></tr>
<tr><td><a class="link" href="reference/asio_handler_is_continuation.html" title="asio_handler_is_continuation">asio_handler_is_continuation</a></td></tr>
<tr><td><a class="link" href="reference/async_compose.html" title="async_compose">async_compose</a></td></tr>
<tr><td><a class="link" href="reference/async_initiate.html" title="async_initiate">async_initiate</a></td></tr>
<tr><td><a class="link" href="reference/bind_executor.html" title="bind_executor">bind_executor</a></td></tr>
<tr><td><a class="link" href="reference/co_spawn.html" title="co_spawn">co_spawn</a></td></tr>
<tr><td><a class="link" href="reference/dispatch.html" title="dispatch">dispatch</a></td></tr>
<tr><td><a class="link" href="reference/defer.html" title="defer">defer</a></td></tr>
<tr><td><a class="link" href="reference/get_associated_allocator.html" title="get_associated_allocator">get_associated_allocator</a></td></tr>
<tr><td><a class="link" href="reference/get_associated_executor.html" title="get_associated_executor">get_associated_executor</a></td></tr>
<tr><td><a class="link" href="reference/execution_context/has_service.html" title="execution_context::has_service">has_service</a></td></tr>
<tr><td><a class="link" href="reference/make_strand.html" title="make_strand">make_strand</a></td></tr>
<tr><td><a class="link" href="reference/make_work_guard.html" title="make_work_guard">make_work_guard</a></td></tr>
<tr><td><a class="link" href="reference/post.html" title="post">post</a></td></tr>
<tr><td><a class="link" href="reference/redirect_error.html" title="redirect_error">redirect_error</a></td></tr>
<tr><td><a class="link" href="reference/spawn.html" title="spawn">spawn</a></td></tr>
<tr><td><a class="link" href="reference/execution_context/use_service.html" title="execution_context::use_service">use_service</a></td></tr>
</table>
</td>
<td valign="top">
<h4>
<a name="idm424582600800"></a>Class Templates</h4>
<table border="0" summary="Simple list" class="simplelist">
<tr><td><a class="link" href="reference/async_completion.html" title="async_completion">async_completion</a></td></tr>
<tr><td><a class="link" href="reference/awaitable.html" title="awaitable">awaitable</a></td></tr>
<tr><td><a class="link" href="reference/basic_io_object.html" title="basic_io_object">basic_io_object</a></td></tr>
<tr><td><a class="link" href="reference/basic_system_executor.html" title="basic_system_executor">basic_system_executor</a></td></tr>
<tr><td><a class="link" href="reference/basic_yield_context.html" title="basic_yield_context">basic_yield_context</a></td></tr>
<tr><td><a class="link" href="reference/executor_binder.html" title="executor_binder">executor_binder</a></td></tr>
<tr><td><a class="link" href="reference/executor_work_guard.html" title="executor_work_guard">executor_work_guard</a></td></tr>
<tr><td><a class="link" href="reference/io_context__basic_executor_type.html" title="io_context::basic_executor_type">io_context::basic_executor_type</a></td></tr>
<tr><td><a class="link" href="reference/redirect_error_t.html" title="redirect_error_t">redirect_error_t</a></td></tr>
<tr><td><a class="link" href="reference/strand.html" title="strand">strand</a></td></tr>
<tr><td><a class="link" href="reference/thread_pool__basic_executor_type.html" title="thread_pool::basic_executor_type">thread_pool::basic_executor_type</a></td></tr>
<tr><td><a class="link" href="reference/use_awaitable_t.html" title="use_awaitable_t">use_awaitable_t</a></td></tr>
<tr><td><a class="link" href="reference/use_future_t.html" title="use_future_t">use_future_t</a></td></tr>
</table>
<h4>
<a name="idm424582586320"></a>Special Values</h4>
<table border="0" summary="Simple list" class="simplelist">
<tr><td><a class="link" href="reference/detached.html" title="detached">detached</a></td></tr>
<tr><td><a class="link" href="reference/executor_arg.html" title="executor_arg">executor_arg</a></td></tr>
<tr><td><a class="link" href="reference/this_coro__executor.html" title="this_coro::executor">this_coro::executor</a></td></tr>
<tr><td><a class="link" href="reference/use_future.html" title="use_future">use_future</a></td></tr>
<tr><td><a class="link" href="reference/use_awaitable.html" title="use_awaitable">use_awaitable</a></td></tr>
</table>
<h4>
<a name="idm424582580160"></a>Boost.Bind Placeholders</h4>
<table border="0" summary="Simple list" class="simplelist">
<tr><td><a class="link" href="reference/placeholders__bytes_transferred.html" title="placeholders::bytes_transferred">placeholders::bytes_transferred</a></td></tr>
<tr><td><a class="link" href="reference/placeholders__endpoint.html" title="placeholders::endpoint">placeholders::endpoint</a></td></tr>
<tr><td><a class="link" href="reference/placeholders__error.html" title="placeholders::error">placeholders::error</a></td></tr>
<tr><td><a class="link" href="reference/placeholders__iterator.html" title="placeholders::iterator">placeholders::iterator</a></td></tr>
<tr><td><a class="link" href="reference/placeholders__results.html" title="placeholders::results">placeholders::results</a></td></tr>
<tr><td><a class="link" href="reference/placeholders__signal_number.html" title="placeholders::signal_number">placeholders::signal_number</a></td></tr>
</table>
</td>
<td valign="top">
<h4>
<a name="idm424582571568"></a>Error Codes</h4>
<table border="0" summary="Simple list" class="simplelist">
<tr><td><a class="link" href="reference/error__basic_errors.html" title="error::basic_errors">error::basic_errors</a></td></tr>
<tr><td><a class="link" href="reference/error__netdb_errors.html" title="error::netdb_errors">error::netdb_errors</a></td></tr>
<tr><td><a class="link" href="reference/error__addrinfo_errors.html" title="error::addrinfo_errors">error::addrinfo_errors</a></td></tr>
<tr><td><a class="link" href="reference/error__misc_errors.html" title="error::misc_errors">error::misc_errors</a></td></tr>
</table>
<h4>
<a name="idm424582565808"></a>Type Traits</h4>
<table border="0" summary="Simple list" class="simplelist">
<tr><td><a class="link" href="reference/associated_allocator.html" title="associated_allocator">associated_allocator</a></td></tr>
<tr><td><a class="link" href="reference/associated_executor.html" title="associated_executor">associated_executor</a></td></tr>
<tr><td><a class="link" href="reference/async_result.html" title="async_result">async_result</a></td></tr>
<tr><td><a class="link" href="reference/default_completion_token.html" title="default_completion_token">default_completion_token</a></td></tr>
<tr><td><a class="link" href="reference/is_executor.html" title="is_executor">is_executor</a></td></tr>
<tr><td><a class="link" href="reference/uses_executor.html" title="uses_executor">uses_executor</a></td></tr>
</table>
<h4>
<a name="idm424582558320"></a>Type Requirements</h4>
<table border="0" summary="Simple list" class="simplelist">
<tr><td><a class="link" href="reference/asynchronous_operations.html" title="Requirements on asynchronous operations">Asynchronous operations</a></td></tr>
<tr><td><a class="link" href="reference/CompletionHandler.html" title="Completion handler requirements">CompletionHandler</a></td></tr>
<tr><td><a class="link" href="reference/ExecutionContext.html" title="Execution context requirements">ExecutionContext</a></td></tr>
<tr><td><a class="link" href="reference/Executor1.html" title="Executor requirements">Executor</a></td></tr>
<tr><td><a class="link" href="reference/Handler.html" title="Handlers">Handler</a></td></tr>
<tr><td><a class="link" href="reference/Service.html" title="Service requirements">Service</a></td></tr>
</table>
</td>
</tr></tbody>
</table>
<table class="table">
<colgroup>
<col>
<col>
<col>
<col>
</colgroup>
<thead><tr><th colspan="4" valign="center">
<h3>
<a name="idm424582546448"></a>Buffers and Buffer-Oriented Operations</h3>
</th></tr></thead>
<tbody><tr>
<td valign="top">
<h4>
<a name="idm424582544400"></a>Classes</h4>
<table border="0" summary="Simple list" class="simplelist">
<tr><td><a class="link" href="reference/const_buffer.html" title="const_buffer">const_buffer</a></td></tr>
<tr><td><a class="link" href="reference/mutable_buffer.html" title="mutable_buffer">mutable_buffer</a></td></tr>
<tr><td>
<a class="link" href="reference/const_buffers_1.html" title="const_buffers_1">const_buffers_1 </a> (deprecated)</td></tr>
<tr><td>
<a class="link" href="reference/mutable_buffers_1.html" title="mutable_buffers_1">mutable_buffers_1 </a> (deprecated)</td></tr>
<tr><td>
<a class="link" href="reference/null_buffers.html" title="null_buffers">null_buffers</a> (deprecated)</td></tr>
<tr><td><a class="link" href="reference/streambuf.html" title="streambuf">streambuf</a></td></tr>
</table>
<h4>
<a name="idm424582536896"></a>Class Templates</h4>
<table border="0" summary="Simple list" class="simplelist">
<tr><td><a class="link" href="reference/basic_streambuf.html" title="basic_streambuf">basic_streambuf</a></td></tr>
<tr><td><a class="link" href="reference/buffered_read_stream.html" title="buffered_read_stream">buffered_read_stream</a></td></tr>
<tr><td><a class="link" href="reference/buffered_stream.html" title="buffered_stream">buffered_stream</a></td></tr>
<tr><td><a class="link" href="reference/buffered_write_stream.html" title="buffered_write_stream">buffered_write_stream</a></td></tr>
<tr><td><a class="link" href="reference/buffers_iterator.html" title="buffers_iterator">buffers_iterator</a></td></tr>
<tr><td><a class="link" href="reference/dynamic_string_buffer.html" title="dynamic_string_buffer">dynamic_string_buffer</a></td></tr>
<tr><td><a class="link" href="reference/dynamic_vector_buffer.html" title="dynamic_vector_buffer">dynamic_vector_buffer</a></td></tr>
</table>
</td>
<td valign="top">
<h4>
<a name="idm424582527472"></a>Free Functions</h4>
<table border="0" summary="Simple list" class="simplelist">
<tr><td><a class="link" href="reference/async_read.html" title="async_read">async_read</a></td></tr>
<tr><td><a class="link" href="reference/async_read_at.html" title="async_read_at">async_read_at</a></td></tr>
<tr><td><a class="link" href="reference/async_read_until.html" title="async_read_until">async_read_until</a></td></tr>
<tr><td><a class="link" href="reference/async_write.html" title="async_write">async_write</a></td></tr>
<tr><td><a class="link" href="reference/async_write_at.html" title="async_write_at">async_write_at</a></td></tr>
<tr><td><a class="link" href="reference/buffer.html" title="buffer">buffer</a></td></tr>
<tr><td>
<a class="link" href="reference/buffer_cast.html" title="buffer_cast">buffer_cast </a> (deprecated)</td></tr>
<tr><td><a class="link" href="reference/buffer_copy.html" title="buffer_copy">buffer_copy</a></td></tr>
<tr><td><a class="link" href="reference/buffer_size.html" title="buffer_size">buffer_size</a></td></tr>
<tr><td><a class="link" href="reference/buffer_sequence_begin.html" title="buffer_sequence_begin">buffer_sequence_begin</a></td></tr>
<tr><td><a class="link" href="reference/buffer_sequence_end.html" title="buffer_sequence_end">buffer_sequence_end</a></td></tr>
<tr><td><a class="link" href="reference/buffers_begin.html" title="buffers_begin">buffers_begin</a></td></tr>
<tr><td><a class="link" href="reference/buffers_end.html" title="buffers_end">buffers_end</a></td></tr>
<tr><td><a class="link" href="reference/dynamic_buffer.html" title="dynamic_buffer">dynamic_buffer</a></td></tr>
<tr><td><a class="link" href="reference/read.html" title="read">read</a></td></tr>
<tr><td><a class="link" href="reference/read_at.html" title="read_at">read_at</a></td></tr>
<tr><td><a class="link" href="reference/read_until.html" title="read_until">read_until</a></td></tr>
<tr><td><a class="link" href="reference/transfer_all.html" title="transfer_all">transfer_all</a></td></tr>
<tr><td><a class="link" href="reference/transfer_at_least.html" title="transfer_at_least">transfer_at_least</a></td></tr>
<tr><td><a class="link" href="reference/transfer_exactly.html" title="transfer_exactly">transfer_exactly</a></td></tr>
<tr><td><a class="link" href="reference/write.html" title="write">write</a></td></tr>
<tr><td><a class="link" href="reference/write_at.html" title="write_at">write_at</a></td></tr>
</table>
</td>
<td valign="top">
<h4>
<a name="idm424582504224"></a>Type Traits</h4>
<table border="0" summary="Simple list" class="simplelist">
<tr><td><a class="link" href="reference/is_const_buffer_sequence.html" title="is_const_buffer_sequence">is_const_buffer_sequence</a></td></tr>
<tr><td><a class="link" href="reference/is_dynamic_buffer.html" title="is_dynamic_buffer">is_dynamic_buffer</a></td></tr>
<tr><td><a class="link" href="reference/is_dynamic_buffer_v1.html" title="is_dynamic_buffer_v1">is_dynamic_buffer_v1</a></td></tr>
<tr><td><a class="link" href="reference/is_dynamic_buffer_v2.html" title="is_dynamic_buffer_v2">is_dynamic_buffer_v2</a></td></tr>
<tr><td><a class="link" href="reference/is_match_condition.html" title="is_match_condition">is_match_condition</a></td></tr>
<tr><td><a class="link" href="reference/is_mutable_buffer_sequence.html" title="is_mutable_buffer_sequence">is_mutable_buffer_sequence</a></td></tr>
<tr><td><a class="link" href="reference/is_read_buffered.html" title="is_read_buffered">is_read_buffered</a></td></tr>
<tr><td><a class="link" href="reference/is_write_buffered.html" title="is_write_buffered">is_write_buffered</a></td></tr>
</table>
</td>
<td valign="top">
<h4>
<a name="idm424582493664"></a>Type Requirements</h4>
<table border="0" summary="Simple list" class="simplelist">
<tr><td><a class="link" href="reference/read_write_operations.html" title="Requirements on read and write operations">Read and write operations</a></td></tr>
<tr><td><a class="link" href="reference/AsyncRandomAccessReadDevice.html" title="Buffer-oriented asynchronous random-access read device requirements">AsyncRandomAccessReadDevice</a></td></tr>
<tr><td><a class="link" href="reference/AsyncRandomAccessWriteDevice.html" title="Buffer-oriented asynchronous random-access write device requirements">AsyncRandomAccessWriteDevice</a></td></tr>
<tr><td><a class="link" href="reference/AsyncReadStream.html" title="Buffer-oriented asynchronous read stream requirements">AsyncReadStream</a></td></tr>
<tr><td><a class="link" href="reference/AsyncWriteStream.html" title="Buffer-oriented asynchronous write stream requirements">AsyncWriteStream</a></td></tr>
<tr><td><a class="link" href="reference/CompletionCondition.html" title="Completion condition requirements">CompletionCondition</a></td></tr>
<tr><td><a class="link" href="reference/ConstBufferSequence.html" title="Constant buffer sequence requirements">ConstBufferSequence</a></td></tr>
<tr><td><a class="link" href="reference/DynamicBuffer.html" title="Dynamic buffer requirements">DynamicBuffer</a></td></tr>
<tr><td><a class="link" href="reference/DynamicBuffer_v1.html" title="Dynamic buffer requirements (version 1)">DynamicBuffer_v1</a></td></tr>
<tr><td><a class="link" href="reference/DynamicBuffer_v2.html" title="Dynamic buffer requirements (version 2)">DynamicBuffer_v2</a></td></tr>
<tr><td><a class="link" href="reference/MutableBufferSequence.html" title="Mutable buffer sequence requirements">MutableBufferSequence</a></td></tr>
<tr><td><a class="link" href="reference/ReadHandler.html" title="Read handler requirements">ReadHandler</a></td></tr>
<tr><td><a class="link" href="reference/SyncRandomAccessReadDevice.html" title="Buffer-oriented synchronous random-access read device requirements">SyncRandomAccessReadDevice</a></td></tr>
<tr><td><a class="link" href="reference/SyncRandomAccessWriteDevice.html" title="Buffer-oriented synchronous random-access write device requirements">SyncRandomAccessWriteDevice</a></td></tr>
<tr><td><a class="link" href="reference/SyncReadStream.html" title="Buffer-oriented synchronous read stream requirements">SyncReadStream</a></td></tr>
<tr><td><a class="link" href="reference/SyncWriteStream.html" title="Buffer-oriented synchronous write stream requirements">SyncWriteStream</a></td></tr>
<tr><td><a class="link" href="reference/WriteHandler.html" title="Write handler requirements">WriteHandler</a></td></tr>
</table>
</td>
</tr></tbody>
</table>
<table class="table">
<colgroup>
<col>
<col>
<col>
<col>
</colgroup>
<thead><tr><th colspan="4" valign="center">
<h3>
<a name="idm424582470848"></a>Networking</h3>
</th></tr></thead>
<tbody><tr>
<td valign="top">
<h4>
<a name="idm424582468832"></a>Classes</h4>
<table border="0" summary="Simple list" class="simplelist">
<tr><td><a class="link" href="reference/generic__datagram_protocol.html" title="generic::datagram_protocol">generic::datagram_protocol</a></td></tr>
<tr><td><a class="link" href="reference/generic__datagram_protocol/endpoint.html" title="generic::datagram_protocol::endpoint">generic::datagram_protocol::endpoint</a></td></tr>
<tr><td><a class="link" href="reference/generic__datagram_protocol/socket.html" title="generic::datagram_protocol::socket">generic::datagram_protocol::socket</a></td></tr>
<tr><td><a class="link" href="reference/generic__raw_protocol.html" title="generic::raw_protocol">generic::raw_protocol</a></td></tr>
<tr><td><a class="link" href="reference/generic__raw_protocol/endpoint.html" title="generic::raw_protocol::endpoint">generic::raw_protocol::endpoint</a></td></tr>
<tr><td><a class="link" href="reference/generic__raw_protocol/socket.html" title="generic::raw_protocol::socket">generic::raw_protocol::socket</a></td></tr>
<tr><td><a class="link" href="reference/generic__seq_packet_protocol.html" title="generic::seq_packet_protocol">generic::seq_packet_protocol</a></td></tr>
<tr><td><a class="link" href="reference/generic__seq_packet_protocol/endpoint.html" title="generic::seq_packet_protocol::endpoint">generic::seq_packet_protocol::endpoint</a></td></tr>
<tr><td><a class="link" href="reference/generic__seq_packet_protocol/socket.html" title="generic::seq_packet_protocol::socket">generic::seq_packet_protocol::socket</a></td></tr>
<tr><td><a class="link" href="reference/generic__stream_protocol.html" title="generic::stream_protocol">generic::stream_protocol</a></td></tr>
<tr><td><a class="link" href="reference/generic__stream_protocol/endpoint.html" title="generic::stream_protocol::endpoint">generic::stream_protocol::endpoint</a></td></tr>
<tr><td><a class="link" href="reference/generic__stream_protocol/iostream.html" title="generic::stream_protocol::iostream">generic::stream_protocol::iostream</a></td></tr>
<tr><td><a class="link" href="reference/generic__stream_protocol/socket.html" title="generic::stream_protocol::socket">generic::stream_protocol::socket</a></td></tr>
<tr><td><a class="link" href="reference/ip__address.html" title="ip::address">ip::address</a></td></tr>
<tr><td><a class="link" href="reference/ip__address_v4.html" title="ip::address_v4">ip::address_v4</a></td></tr>
<tr><td><a class="link" href="reference/ip__address_v4_iterator.html" title="ip::address_v4_iterator">ip::address_v4_iterator</a></td></tr>
<tr><td><a class="link" href="reference/ip__address_v4_range.html" title="ip::address_v4_range">ip::address_v4_range</a></td></tr>
<tr><td><a class="link" href="reference/ip__address_v6.html" title="ip::address_v6">ip::address_v6</a></td></tr>
<tr><td><a class="link" href="reference/ip__address_v6_iterator.html" title="ip::address_v6_iterator">ip::address_v6_iterator</a></td></tr>
<tr><td><a class="link" href="reference/ip__address_v6_range.html" title="ip::address_v6_range">ip::address_v6_range</a></td></tr>
<tr><td><a class="link" href="reference/ip__bad_address_cast.html" title="ip::bad_address_cast">ip::bad_address_cast</a></td></tr>
<tr><td><a class="link" href="reference/ip__icmp.html" title="ip::icmp">ip::icmp</a></td></tr>
<tr><td><a class="link" href="reference/ip__icmp/endpoint.html" title="ip::icmp::endpoint">ip::icmp::endpoint</a></td></tr>
<tr><td><a class="link" href="reference/ip__icmp/resolver.html" title="ip::icmp::resolver">ip::icmp::resolver</a></td></tr>
<tr><td><a class="link" href="reference/ip__icmp/socket.html" title="ip::icmp::socket">ip::icmp::socket</a></td></tr>
<tr><td><a class="link" href="reference/ip__network_v4.html" title="ip::network_v4">ip::network_v4</a></td></tr>
<tr><td><a class="link" href="reference/ip__network_v6.html" title="ip::network_v6">ip::network_v6</a></td></tr>
<tr><td><a class="link" href="reference/ip__resolver_base.html" title="ip::resolver_base">ip::resolver_base</a></td></tr>
<tr><td><a class="link" href="reference/ip__resolver_query_base.html" title="ip::resolver_query_base">ip::resolver_query_base</a></td></tr>
<tr><td><a class="link" href="reference/ip__tcp.html" title="ip::tcp">ip::tcp</a></td></tr>
<tr><td><a class="link" href="reference/ip__tcp/acceptor.html" title="ip::tcp::acceptor">ip::tcp::acceptor</a></td></tr>
<tr><td><a class="link" href="reference/ip__tcp/endpoint.html" title="ip::tcp::endpoint">ip::tcp::endpoint</a></td></tr>
<tr><td><a class="link" href="reference/ip__tcp/iostream.html" title="ip::tcp::iostream">ip::tcp::iostream</a></td></tr>
<tr><td><a class="link" href="reference/ip__tcp/resolver.html" title="ip::tcp::resolver">ip::tcp::resolver</a></td></tr>
<tr><td><a class="link" href="reference/ip__tcp/socket.html" title="ip::tcp::socket">ip::tcp::socket</a></td></tr>
<tr><td><a class="link" href="reference/ip__udp.html" title="ip::udp">ip::udp</a></td></tr>
<tr><td><a class="link" href="reference/ip__udp/endpoint.html" title="ip::udp::endpoint">ip::udp::endpoint</a></td></tr>
<tr><td><a class="link" href="reference/ip__udp/resolver.html" title="ip::udp::resolver">ip::udp::resolver</a></td></tr>
<tr><td><a class="link" href="reference/ip__udp/socket.html" title="ip::udp::socket">ip::udp::socket</a></td></tr>
<tr><td><a class="link" href="reference/ip__v4_mapped_t.html" title="ip::v4_mapped_t">ip::v4_mapped_t</a></td></tr>
<tr><td><a class="link" href="reference/socket_base.html" title="socket_base">socket_base</a></td></tr>
</table>
</td>
<td valign="top">
<h4>
<a name="idm424582408912"></a>Free Functions</h4>
<table border="0" summary="Simple list" class="simplelist">
<tr><td><a class="link" href="reference/async_connect.html" title="async_connect">async_connect</a></td></tr>
<tr><td><a class="link" href="reference/connect.html" title="connect">connect</a></td></tr>
<tr><td><a class="link" href="reference/ip__host_name.html" title="ip::host_name">ip::host_name</a></td></tr>
<tr><td><a class="link" href="reference/ip__address/make_address.html" title="ip::address::make_address">ip::make_address</a></td></tr>
<tr><td><a class="link" href="reference/ip__address_v4/make_address_v4.html" title="ip::address_v4::make_address_v4">ip::make_address_v4</a></td></tr>
<tr><td><a class="link" href="reference/ip__address_v6/make_address_v6.html" title="ip::address_v6::make_address_v6">ip::make_address_v6</a></td></tr>
<tr><td><a class="link" href="reference/ip__network_v4/make_network_v4.html" title="ip::network_v4::make_network_v4">ip::make_network_v4</a></td></tr>
<tr><td><a class="link" href="reference/ip__network_v6/make_network_v6.html" title="ip::network_v6::make_network_v6">ip::make_network_v6</a></td></tr>
</table>
<h4>
<a name="idm424582399360"></a>Class Templates</h4>
<table border="0" summary="Simple list" class="simplelist">
<tr><td><a class="link" href="reference/basic_datagram_socket.html" title="basic_datagram_socket">basic_datagram_socket</a></td></tr>
<tr><td><a class="link" href="reference/basic_raw_socket.html" title="basic_raw_socket">basic_raw_socket</a></td></tr>
<tr><td><a class="link" href="reference/basic_seq_packet_socket.html" title="basic_seq_packet_socket">basic_seq_packet_socket</a></td></tr>
<tr><td><a class="link" href="reference/basic_socket.html" title="basic_socket">basic_socket</a></td></tr>
<tr><td><a class="link" href="reference/basic_socket_acceptor.html" title="basic_socket_acceptor">basic_socket_acceptor</a></td></tr>
<tr><td><a class="link" href="reference/basic_socket_iostream.html" title="basic_socket_iostream">basic_socket_iostream</a></td></tr>
<tr><td><a class="link" href="reference/basic_socket_streambuf.html" title="basic_socket_streambuf">basic_socket_streambuf</a></td></tr>
<tr><td><a class="link" href="reference/basic_stream_socket.html" title="basic_stream_socket">basic_stream_socket</a></td></tr>
<tr><td><a class="link" href="reference/generic__basic_endpoint.html" title="generic::basic_endpoint">generic::basic_endpoint</a></td></tr>
<tr><td><a class="link" href="reference/ip__basic_endpoint.html" title="ip::basic_endpoint">ip::basic_endpoint</a></td></tr>
<tr><td><a class="link" href="reference/ip__basic_resolver.html" title="ip::basic_resolver">ip::basic_resolver</a></td></tr>
<tr><td><a class="link" href="reference/ip__basic_resolver_entry.html" title="ip::basic_resolver_entry">ip::basic_resolver_entry</a></td></tr>
<tr><td><a class="link" href="reference/ip__basic_resolver_iterator.html" title="ip::basic_resolver_iterator">ip::basic_resolver_iterator</a></td></tr>
<tr><td><a class="link" href="reference/ip__basic_resolver_results.html" title="ip::basic_resolver_results">ip::basic_resolver_results</a></td></tr>
<tr><td><a class="link" href="reference/ip__basic_resolver_query.html" title="ip::basic_resolver_query">ip::basic_resolver_query</a></td></tr>
</table>
</td>
<td valign="top">
<h4>
<a name="idm424582382144"></a>Socket Options</h4>
<table border="0" summary="Simple list" class="simplelist">
<tr><td><a class="link" href="reference/ip__multicast__enable_loopback.html" title="ip::multicast::enable_loopback">ip::multicast::enable_loopback</a></td></tr>
<tr><td><a class="link" href="reference/ip__multicast__hops.html" title="ip::multicast::hops">ip::multicast::hops</a></td></tr>
<tr><td><a class="link" href="reference/ip__multicast__join_group.html" title="ip::multicast::join_group">ip::multicast::join_group</a></td></tr>
<tr><td><a class="link" href="reference/ip__multicast__leave_group.html" title="ip::multicast::leave_group">ip::multicast::leave_group</a></td></tr>
<tr><td><a class="link" href="reference/ip__multicast__outbound_interface.html" title="ip::multicast::outbound_interface">ip::multicast::outbound_interface</a></td></tr>
<tr><td><a class="link" href="reference/ip__tcp/no_delay.html" title="ip::tcp::no_delay">ip::tcp::no_delay</a></td></tr>
<tr><td><a class="link" href="reference/ip__unicast__hops.html" title="ip::unicast::hops">ip::unicast::hops</a></td></tr>
<tr><td><a class="link" href="reference/ip__v6_only.html" title="ip::v6_only">ip::v6_only</a></td></tr>
<tr><td><a class="link" href="reference/socket_base/broadcast.html" title="socket_base::broadcast">socket_base::broadcast</a></td></tr>
<tr><td><a class="link" href="reference/socket_base/debug.html" title="socket_base::debug">socket_base::debug</a></td></tr>
<tr><td><a class="link" href="reference/socket_base/do_not_route.html" title="socket_base::do_not_route">socket_base::do_not_route</a></td></tr>
<tr><td><a class="link" href="reference/socket_base/enable_connection_aborted.html" title="socket_base::enable_connection_aborted">socket_base::enable_connection_aborted</a></td></tr>
<tr><td><a class="link" href="reference/socket_base/keep_alive.html" title="socket_base::keep_alive">socket_base::keep_alive</a></td></tr>
<tr><td><a class="link" href="reference/socket_base/linger.html" title="socket_base::linger">socket_base::linger</a></td></tr>
<tr><td><a class="link" href="reference/socket_base/receive_buffer_size.html" title="socket_base::receive_buffer_size">socket_base::receive_buffer_size</a></td></tr>
<tr><td><a class="link" href="reference/socket_base/receive_low_watermark.html" title="socket_base::receive_low_watermark">socket_base::receive_low_watermark</a></td></tr>
<tr><td><a class="link" href="reference/socket_base/reuse_address.html" title="socket_base::reuse_address">socket_base::reuse_address</a></td></tr>
<tr><td><a class="link" href="reference/socket_base/send_buffer_size.html" title="socket_base::send_buffer_size">socket_base::send_buffer_size</a></td></tr>
<tr><td><a class="link" href="reference/socket_base/send_low_watermark.html" title="socket_base::send_low_watermark">socket_base::send_low_watermark</a></td></tr>
</table>
</td>
<td valign="top">
<h4>
<a name="idm424582359424"></a>I/O Control Commands</h4>
<table border="0" summary="Simple list" class="simplelist"><tr><td><a class="link" href="reference/socket_base/bytes_readable.html" title="socket_base::bytes_readable">socket_base::bytes_readable</a></td></tr></table>
<h4>
<a name="idm424582356832"></a>Type Requirements</h4>
<table border="0" summary="Simple list" class="simplelist">
<tr><td><a class="link" href="reference/synchronous_socket_operations.html" title="Requirements on synchronous socket operations">Synchronous socket operations</a></td></tr>
<tr><td><a class="link" href="reference/asynchronous_socket_operations.html" title="Requirements on asynchronous socket operations">Asynchronous socket operations</a></td></tr>
<tr><td><a class="link" href="reference/AcceptableProtocol.html" title="Acceptable protocol requirements">AcceptableProtocol</a></td></tr>
<tr><td><a class="link" href="reference/AcceptHandler.html" title="Accept handler requirements">AcceptHandler</a></td></tr>
<tr><td><a class="link" href="reference/ConnectCondition.html" title="Connect condition requirements">ConnectCondition</a></td></tr>
<tr><td><a class="link" href="reference/ConnectHandler.html" title="Connect handler requirements">ConnectHandler</a></td></tr>
<tr><td><a class="link" href="reference/Endpoint.html" title="Endpoint requirements">Endpoint</a></td></tr>
<tr><td><a class="link" href="reference/EndpointSequence.html" title="Endpoint sequence requirements">EndpointSequence</a></td></tr>
<tr><td><a class="link" href="reference/GettableSocketOption.html" title="Gettable socket option requirements">GettableSocketOption</a></td></tr>
<tr><td><a class="link" href="reference/InternetProtocol.html" title="Internet protocol requirements">InternetProtocol</a></td></tr>
<tr><td><a class="link" href="reference/IoControlCommand.html" title="I/O control command requirements">IoControlCommand</a></td></tr>
<tr><td><a class="link" href="reference/IteratorConnectHandler.html" title="Iterator connect handler requirements">IteratorConnectHandler</a></td></tr>
<tr><td><a class="link" href="reference/MoveAcceptHandler.html" title="Move accept handler requirements">MoveAcceptHandler</a></td></tr>
<tr><td><a class="link" href="reference/Protocol.html" title="Protocol requirements">Protocol</a></td></tr>
<tr><td><a class="link" href="reference/RangeConnectHandler.html" title="Range connect handler requirements">RangeConnectHandler</a></td></tr>
<tr><td><a class="link" href="reference/ResolveHandler.html" title="Resolve handler requirements">ResolveHandler</a></td></tr>
<tr><td><a class="link" href="reference/SettableSocketOption.html" title="Settable socket option requirements">SettableSocketOption</a></td></tr>
</table>
</td>
</tr></tbody>
</table>
<table class="table">
<colgroup>
<col>
<col>
<col>
<col>
</colgroup>
<thead><tr>
<th valign="center">
<h3>
<a name="idm424582333312"></a>Timers</h3>
</th>
<th valign="center">
<h3>
<a name="idm424582331600"></a>SSL</h3>
</th>
<th valign="center">
<h3>
<a name="idm424582329904"></a>Serial Ports</h3>
</th>
<th valign="center">
<h3>
<a name="idm424582328192"></a>Signal Handling</h3>
</th>
</tr></thead>
<tbody><tr>
<td valign="top">
<h4>
<a name="idm424582326176"></a>Classes</h4>
<table border="0" summary="Simple list" class="simplelist">
<tr><td><a class="link" href="reference/deadline_timer.html" title="deadline_timer">deadline_timer</a></td></tr>
<tr><td><a class="link" href="reference/high_resolution_timer.html" title="high_resolution_timer">high_resolution_timer</a></td></tr>
<tr><td><a class="link" href="reference/steady_timer.html" title="steady_timer">steady_timer</a></td></tr>
<tr><td><a class="link" href="reference/system_timer.html" title="system_timer">system_timer</a></td></tr>
</table>
<h4>
<a name="idm424582321072"></a>Class Templates</h4>
<table border="0" summary="Simple list" class="simplelist">
<tr><td><a class="link" href="reference/basic_deadline_timer.html" title="basic_deadline_timer">basic_deadline_timer</a></td></tr>
<tr><td><a class="link" href="reference/basic_waitable_timer.html" title="basic_waitable_timer">basic_waitable_timer</a></td></tr>
<tr><td><a class="link" href="reference/time_traits_lt__ptime__gt_.html" title="time_traits&lt; boost::posix_time::ptime &gt;">time_traits</a></td></tr>
<tr><td><a class="link" href="reference/wait_traits.html" title="wait_traits">wait_traits</a></td></tr>
</table>
<h4>
<a name="idm424582315648"></a>Type Requirements</h4>
<table border="0" summary="Simple list" class="simplelist">
<tr><td><a class="link" href="reference/TimeTraits.html" title="Time traits requirements">TimeTraits</a></td></tr>
<tr><td><a class="link" href="reference/WaitHandler.html" title="Wait handler requirements">WaitHandler</a></td></tr>
<tr><td><a class="link" href="reference/WaitTraits.html" title="Wait traits requirements">WaitTraits</a></td></tr>
</table>
</td>
<td valign="top">
<h4>
<a name="idm424582310448"></a>Classes</h4>
<table border="0" summary="Simple list" class="simplelist">
<tr><td><a class="link" href="reference/ssl__context.html" title="ssl::context">ssl::context</a></td></tr>
<tr><td><a class="link" href="reference/ssl__context_base.html" title="ssl::context_base">ssl::context_base</a></td></tr>
<tr><td><a class="link" href="reference/ssl__host_name_verification.html" title="ssl::host_name_verification">ssl::host_name_verification</a></td></tr>
<tr><td>
<a class="link" href="reference/ssl__rfc2818_verification.html" title="ssl::rfc2818_verification">ssl::rfc2818_verification</a> (deprecated)</td></tr>
<tr><td><a class="link" href="reference/ssl__stream_base.html" title="ssl::stream_base">ssl::stream_base</a></td></tr>
<tr><td><a class="link" href="reference/ssl__verify_context.html" title="ssl::verify_context">ssl::verify_context</a></td></tr>
</table>
<h4>
<a name="idm424582302672"></a>Class Templates</h4>
<table border="0" summary="Simple list" class="simplelist"><tr><td><a class="link" href="reference/ssl__stream.html" title="ssl::stream">ssl::stream</a></td></tr></table>
<h4>
<a name="idm424582300304"></a>Error Codes</h4>
<table border="0" summary="Simple list" class="simplelist"><tr><td><a class="link" href="reference/ssl__error__stream_errors.html" title="ssl::error::stream_errors">ssl::error::stream_errors</a></td></tr></table>
<h4>
<a name="idm424582297712"></a>Type Requirements</h4>
<table border="0" summary="Simple list" class="simplelist">
<tr><td><a class="link" href="reference/BufferedHandshakeHandler.html" title="Buffered handshake handler requirements">BufferedHandshakeHandler</a></td></tr>
<tr><td><a class="link" href="reference/HandshakeHandler.html" title="SSL handshake handler requirements">HandshakeHandler</a></td></tr>
<tr><td><a class="link" href="reference/ShutdownHandler.html" title="SSL shutdown handler requirements">ShutdownHandler</a></td></tr>
</table>
</td>
<td valign="top">
<h4>
<a name="idm424582292496"></a>Classes</h4>
<table border="0" summary="Simple list" class="simplelist">
<tr><td><a class="link" href="reference/serial_port.html" title="serial_port">serial_port</a></td></tr>
<tr><td><a class="link" href="reference/serial_port_base.html" title="serial_port_base">serial_port_base</a></td></tr>
</table>
<h4>
<a name="idm424582289232"></a>Class templates</h4>
<table border="0" summary="Simple list" class="simplelist"><tr><td><a class="link" href="reference/basic_serial_port.html" title="basic_serial_port">basic_serial_port</a></td></tr></table>
<h4>
<a name="idm424582286608"></a>Serial Port Options</h4>
<table border="0" summary="Simple list" class="simplelist">
<tr><td><a class="link" href="reference/serial_port_base__baud_rate.html" title="serial_port_base::baud_rate">serial_port_base::baud_rate</a></td></tr>
<tr><td><a class="link" href="reference/serial_port_base__flow_control.html" title="serial_port_base::flow_control">serial_port_base::flow_control</a></td></tr>
<tr><td><a class="link" href="reference/serial_port_base__parity.html" title="serial_port_base::parity">serial_port_base::parity</a></td></tr>
<tr><td><a class="link" href="reference/serial_port_base__stop_bits.html" title="serial_port_base::stop_bits">serial_port_base::stop_bits</a></td></tr>
<tr><td><a class="link" href="reference/serial_port_base__character_size.html" title="serial_port_base::character_size">serial_port_base::character_size</a></td></tr>
</table>
<h4>
<a name="idm424582280416"></a>Type Requirements</h4>
<table border="0" summary="Simple list" class="simplelist">
<tr><td><a class="link" href="reference/GettableSerialPortOption.html" title="Gettable serial port option requirements">GettableSerialPortOption</a></td></tr>
<tr><td><a class="link" href="reference/SettableSerialPortOption.html" title="Settable serial port option requirements">SettableSerialPortOption</a></td></tr>
</table>
</td>
<td valign="top">
<h4>
<a name="idm424582276080"></a>Classes</h4>
<table border="0" summary="Simple list" class="simplelist"><tr><td><a class="link" href="reference/signal_set.html" title="signal_set">signal_set</a></td></tr></table>
<h4>
<a name="idm424582273712"></a>Class Templates</h4>
<table border="0" summary="Simple list" class="simplelist"><tr><td><a class="link" href="reference/basic_signal_set.html" title="basic_signal_set">basic_signal_set</a></td></tr></table>
<h4>
<a name="idm424582271200"></a>Type Requirements</h4>
<table border="0" summary="Simple list" class="simplelist"><tr><td><a class="link" href="reference/SignalHandler.html" title="Signal handler requirements">SignalHandler</a></td></tr></table>
</td>
</tr></tbody>
</table>
<table class="table">
<colgroup>
<col>
<col>
<col>
</colgroup>
<thead><tr>
<th colspan="2" valign="center">
<h3>
<a name="idm424582264736"></a>POSIX-specific</h3>
</th>
<th valign="center">
<h3>
<a name="idm424582263024"></a>Windows-specific</h3>
</th>
</tr></thead>
<tbody><tr>
<td valign="top">
<h4>
<a name="idm424582260992"></a>Classes</h4>
<table border="0" summary="Simple list" class="simplelist">
<tr><td><a class="link" href="reference/local__stream_protocol.html" title="local::stream_protocol">local::stream_protocol</a></td></tr>
<tr><td><a class="link" href="reference/local__stream_protocol/acceptor.html" title="local::stream_protocol::acceptor">local::stream_protocol::acceptor</a></td></tr>
<tr><td><a class="link" href="reference/local__stream_protocol/endpoint.html" title="local::stream_protocol::endpoint">local::stream_protocol::endpoint</a></td></tr>
<tr><td><a class="link" href="reference/local__stream_protocol/iostream.html" title="local::stream_protocol::iostream">local::stream_protocol::iostream</a></td></tr>
<tr><td><a class="link" href="reference/local__stream_protocol/socket.html" title="local::stream_protocol::socket">local::stream_protocol::socket</a></td></tr>
<tr><td><a class="link" href="reference/local__datagram_protocol.html" title="local::datagram_protocol">local::datagram_protocol</a></td></tr>
<tr><td><a class="link" href="reference/local__datagram_protocol/endpoint.html" title="local::datagram_protocol::endpoint">local::datagram_protocol::endpoint</a></td></tr>
<tr><td><a class="link" href="reference/local__datagram_protocol/socket.html" title="local::datagram_protocol::socket">local::datagram_protocol::socket</a></td></tr>
<tr><td><a class="link" href="reference/posix__descriptor.html" title="posix::descriptor">posix::descriptor</a></td></tr>
<tr><td><a class="link" href="reference/posix__descriptor_base.html" title="posix::descriptor_base">posix::descriptor_base</a></td></tr>
<tr><td><a class="link" href="reference/posix__stream_descriptor.html" title="posix::stream_descriptor">posix::stream_descriptor</a></td></tr>
</table>
</td>
<td valign="top">
<h4>
<a name="idm424582248048"></a>Free Functions</h4>
<table border="0" summary="Simple list" class="simplelist"><tr><td><a class="link" href="reference/local__connect_pair.html" title="local::connect_pair">local::connect_pair</a></td></tr></table>
<h4>
<a name="idm424582245632"></a>Class Templates</h4>
<table border="0" summary="Simple list" class="simplelist">
<tr><td><a class="link" href="reference/local__basic_endpoint.html" title="local::basic_endpoint">local::basic_endpoint</a></td></tr>
<tr><td><a class="link" href="reference/posix__basic_descriptor.html" title="posix::basic_descriptor">posix::basic_descriptor</a></td></tr>
<tr><td><a class="link" href="reference/posix__basic_stream_descriptor.html" title="posix::basic_stream_descriptor">posix::basic_stream_descriptor</a></td></tr>
</table>
</td>
<td valign="top">
<h4>
<a name="idm424582240272"></a>Classes</h4>
<table border="0" summary="Simple list" class="simplelist">
<tr><td><a class="link" href="reference/windows__object_handle.html" title="windows::object_handle">windows::object_handle</a></td></tr>
<tr><td><a class="link" href="reference/windows__overlapped_handle.html" title="windows::overlapped_handle">windows::overlapped_handle</a></td></tr>
<tr><td><a class="link" href="reference/windows__overlapped_ptr.html" title="windows::overlapped_ptr">windows::overlapped_ptr</a></td></tr>
<tr><td><a class="link" href="reference/windows__random_access_handle.html" title="windows::random_access_handle">windows::random_access_handle</a></td></tr>
<tr><td><a class="link" href="reference/windows__stream_handle.html" title="windows::stream_handle">windows::stream_handle</a></td></tr>
</table>
<h4>
<a name="idm424582233776"></a>Class Templates</h4>
<table border="0" summary="Simple list" class="simplelist">
<tr><td><a class="link" href="reference/windows__basic_object_handle.html" title="windows::basic_object_handle">windows::basic_object_handle</a></td></tr>
<tr><td><a class="link" href="reference/windows__basic_overlapped_handle.html" title="windows::basic_overlapped_handle">windows::basic_overlapped_handle</a></td></tr>
<tr><td><a class="link" href="reference/windows__basic_random_access_handle.html" title="windows::basic_random_access_handle">windows::basic_random_access_handle</a></td></tr>
<tr><td><a class="link" href="reference/windows__basic_stream_handle.html" title="windows::basic_stream_handle">windows::basic_stream_handle</a></td></tr>
</table>
</td>
</tr></tbody>
</table>
</div>
</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-2020 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="examples/cpp17_examples.html"><img src="../prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../home.png" alt="Home"></a><a accesskey="n" href="reference/asynchronous_operations.html"><img src="../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,105 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Accept handler requirements</title>
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../index.html" title="Asio">
<link rel="up" href="../reference.html" title="Reference">
<link rel="prev" href="AcceptableProtocol.html" title="Acceptable protocol requirements">
<link rel="next" href="AsyncRandomAccessReadDevice.html" title="Buffer-oriented asynchronous random-access read device requirements">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="AcceptableProtocol.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="AsyncRandomAccessReadDevice.html"><img src="../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="asio.reference.AcceptHandler"></a><a class="link" href="AcceptHandler.html" title="Accept handler requirements">Accept handler requirements</a>
</h3></div></div></div>
<p>
An accept handler must meet the requirements for a <a class="link" href="Handler.html" title="Handlers">handler</a>.
A value <code class="computeroutput">h</code> of an accept handler class should work correctly in
the expression <code class="computeroutput">h(ec)</code>, where <code class="computeroutput">ec</code> is an lvalue of
type <code class="computeroutput">const error_code</code>.
</p>
<h5>
<a name="asio.reference.AcceptHandler.h0"></a>
<span><a name="asio.reference.AcceptHandler.examples"></a></span><a class="link" href="AcceptHandler.html#asio.reference.AcceptHandler.examples">Examples</a>
</h5>
<p>
A free function as an accept handler:
</p>
<pre class="programlisting">void accept_handler(
const asio::error_code&amp; ec)
{
...
}
</pre>
<p>
An accept handler function object:
</p>
<pre class="programlisting">struct accept_handler
{
...
void operator()(
const asio::error_code&amp; ec)
{
...
}
...
};
</pre>
<p>
A lambda as an accept handler:
</p>
<pre class="programlisting">acceptor.async_accept(...,
[](const asio::error_code&amp; ec)
{
...
});
</pre>
<p>
A non-static class member function adapted to an accept handler using <code class="computeroutput">std::bind()</code>:
</p>
<pre class="programlisting">void my_class::accept_handler(
const asio::error_code&amp; ec)
{
...
}
...
acceptor.async_accept(...,
std::bind(&amp;my_class::accept_handler,
this, std::placeholders::_1));
</pre>
<p>
A non-static class member function adapted to an accept handler using <code class="computeroutput">boost::bind()</code>:
</p>
<pre class="programlisting">void my_class::accept_handler(
const asio::error_code&amp; ec)
{
...
}
...
acceptor.async_accept(...,
boost::bind(&amp;my_class::accept_handler,
this, asio::placeholders::error));
</pre>
</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-2020 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="AcceptableProtocol.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="AsyncRandomAccessReadDevice.html"><img src="../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,88 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Acceptable protocol requirements</title>
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../index.html" title="Asio">
<link rel="up" href="../reference.html" title="Reference">
<link rel="prev" href="asynchronous_socket_operations.html" title="Requirements on asynchronous socket operations">
<link rel="next" href="AcceptHandler.html" title="Accept handler requirements">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="asynchronous_socket_operations.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="AcceptHandler.html"><img src="../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="asio.reference.AcceptableProtocol"></a><a class="link" href="AcceptableProtocol.html" title="Acceptable protocol requirements">Acceptable protocol
requirements</a>
</h3></div></div></div>
<p>
A type <code class="computeroutput">X</code> meets the <code class="computeroutput">AcceptableProtocol</code> requirements
if it satisfies the requirements of <a class="link" href="Protocol.html" title="Protocol requirements"><code class="computeroutput">Protocol</code></a>
as well as the additional requirements listed below.
</p>
<div class="table">
<a name="asio.reference.AcceptableProtocol.t0"></a><p class="title"><b>Table 1. AcceptableProtocol requirements</b></p>
<div class="table-contents"><table class="table" summary="AcceptableProtocol requirements">
<colgroup>
<col>
<col>
<col>
</colgroup>
<thead><tr>
<th>
<p>
expression
</p>
</th>
<th>
<p>
return type
</p>
</th>
<th>
<p>
assertion/note<br> pre/post-conditions
</p>
</th>
</tr></thead>
<tbody><tr>
<td>
<p>
<code class="computeroutput">X::socket</code>
</p>
</td>
<td>
<p>
A type that satisfies the requirements of <code class="computeroutput">Destructible</code>
(C++Std [destructible]) and <code class="computeroutput">MoveConstructible</code> (C++Std
[moveconstructible]), and that is publicly and unambiguously derived
from <code class="computeroutput">basic_socket&lt;X&gt;</code>.
</p>
</td>
<td>
</td>
</tr></tbody>
</table></div>
</div>
<br class="table-break">
</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-2020 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="asynchronous_socket_operations.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="AcceptHandler.html"><img src="../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,128 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Buffer-oriented asynchronous random-access read device requirements</title>
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../index.html" title="Asio">
<link rel="up" href="../reference.html" title="Reference">
<link rel="prev" href="AcceptHandler.html" title="Accept handler requirements">
<link rel="next" href="AsyncRandomAccessWriteDevice.html" title="Buffer-oriented asynchronous random-access write device requirements">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="AcceptHandler.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="AsyncRandomAccessWriteDevice.html"><img src="../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="asio.reference.AsyncRandomAccessReadDevice"></a><a class="link" href="AsyncRandomAccessReadDevice.html" title="Buffer-oriented asynchronous random-access read device requirements">Buffer-oriented
asynchronous random-access read device requirements</a>
</h3></div></div></div>
<p>
In the table below, <code class="computeroutput">a</code> denotes an asynchronous random access
read device object, <code class="computeroutput">o</code> denotes an offset of type <code class="computeroutput">boost::uint64_t</code>,
<code class="computeroutput">mb</code> denotes an object satisfying <a class="link" href="MutableBufferSequence.html" title="Mutable buffer sequence requirements">mutable
buffer sequence</a> requirements, and <code class="computeroutput">h</code> denotes an object
satisfying <a class="link" href="ReadHandler.html" title="Read handler requirements">read handler</a>
requirements.
</p>
<div class="table">
<a name="asio.reference.AsyncRandomAccessReadDevice.t0"></a><p class="title"><b>Table 2. Buffer-oriented asynchronous random-access read device requirements</b></p>
<div class="table-contents"><table class="table" summary="Buffer-oriented asynchronous random-access read device requirements">
<colgroup>
<col>
<col>
<col>
</colgroup>
<thead><tr>
<th>
<p>
operation
</p>
</th>
<th>
<p>
type
</p>
</th>
<th>
<p>
semantics, pre/post-conditions
</p>
</th>
</tr></thead>
<tbody>
<tr>
<td>
<p>
<code class="computeroutput">a.get_executor()</code>
</p>
</td>
<td>
<p>
A type satisfying the <a class="link" href="Executor1.html" title="Executor requirements">Executor
requirements</a>.
</p>
</td>
<td>
<p>
Returns the associated I/O executor.
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">a.async_read_some_at(o, mb, h);</code>
</p>
</td>
<td>
<p>
<code class="computeroutput">void</code>
</p>
</td>
<td>
<p>
Initiates an asynchronous operation to read one or more bytes of
data from the device <code class="computeroutput">a</code> at the offset <code class="computeroutput">o</code>.
The operation is performed via the <code class="computeroutput">io_service</code> object
<code class="computeroutput">a.get_io_service()</code> and behaves according to <a class="link" href="asynchronous_operations.html" title="Requirements on asynchronous operations">asynchronous operation</a>
requirements.<br> <br> The mutable buffer sequence <code class="computeroutput">mb</code>
specifies memory where the data should be placed. The <code class="computeroutput">async_read_some_at</code>
operation shall always fill a buffer in the sequence completely
before proceeding to the next.<br> <br> The implementation
shall maintain one or more copies of <code class="computeroutput">mb</code> until such
time as the read operation no longer requires access to the memory
specified by the buffers in the sequence. The program must ensure
the memory is valid until:<br> <br> — the last copy of <code class="computeroutput">mb</code>
is destroyed, or<br> <br> — the handler for the asynchronous
read operation is invoked,<br> <br> whichever comes first.<br>
<br> If the total size of all buffers in the sequence <code class="computeroutput">mb</code>
is <code class="computeroutput">0</code>, the asynchronous read operation shall complete
immediately and pass <code class="computeroutput">0</code> as the argument to the handler
that specifies the number of bytes read.
</p>
</td>
</tr>
</tbody>
</table></div>
</div>
<br class="table-break">
</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-2020 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="AcceptHandler.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="AsyncRandomAccessWriteDevice.html"><img src="../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,129 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Buffer-oriented asynchronous random-access write device requirements</title>
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../index.html" title="Asio">
<link rel="up" href="../reference.html" title="Reference">
<link rel="prev" href="AsyncRandomAccessReadDevice.html" title="Buffer-oriented asynchronous random-access read device requirements">
<link rel="next" href="AsyncReadStream.html" title="Buffer-oriented asynchronous read stream requirements">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="AsyncRandomAccessReadDevice.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="AsyncReadStream.html"><img src="../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="asio.reference.AsyncRandomAccessWriteDevice"></a><a class="link" href="AsyncRandomAccessWriteDevice.html" title="Buffer-oriented asynchronous random-access write device requirements">Buffer-oriented
asynchronous random-access write device requirements</a>
</h3></div></div></div>
<p>
In the table below, <code class="computeroutput">a</code> denotes an asynchronous write stream object,
<code class="computeroutput">o</code> denotes an offset of type <code class="computeroutput">boost::uint64_t</code>, <code class="computeroutput">cb</code>
denotes an object satisfying <a class="link" href="ConstBufferSequence.html" title="Constant buffer sequence requirements">constant
buffer sequence</a> requirements, and <code class="computeroutput">h</code> denotes an object
satisfying <a class="link" href="WriteHandler.html" title="Write handler requirements">write handler</a>
requirements.
</p>
<div class="table">
<a name="asio.reference.AsyncRandomAccessWriteDevice.t0"></a><p class="title"><b>Table 3. Buffer-oriented asynchronous random-access write device requirements</b></p>
<div class="table-contents"><table class="table" summary="Buffer-oriented asynchronous random-access write device requirements">
<colgroup>
<col>
<col>
<col>
</colgroup>
<thead><tr>
<th>
<p>
operation
</p>
</th>
<th>
<p>
type
</p>
</th>
<th>
<p>
semantics, pre/post-conditions
</p>
</th>
</tr></thead>
<tbody>
<tr>
<td>
<p>
<code class="computeroutput">a.get_executor()</code>
</p>
</td>
<td>
<p>
A type satisfying the <a class="link" href="Executor1.html" title="Executor requirements">Executor
requirements</a>.
</p>
</td>
<td>
<p>
Returns the associated I/O executor.
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">a.async_write_some_at(o, cb, h);</code>
</p>
</td>
<td>
<p>
<code class="computeroutput">void</code>
</p>
</td>
<td>
<p>
Initiates an asynchronous operation to write one or more bytes
of data to the device <code class="computeroutput">a</code> at offset <code class="computeroutput">o</code>.
The operation is performed via the <code class="computeroutput">io_service</code> object
<code class="computeroutput">a.get_io_service()</code> and behaves according to <a class="link" href="asynchronous_operations.html" title="Requirements on asynchronous operations">asynchronous operation</a>
requirements.<br> <br> The constant buffer sequence <code class="computeroutput">cb</code>
specifies memory where the data to be written is located. The
<code class="computeroutput">async_write_some_at</code> operation shall always write a
buffer in the sequence completely before proceeding to the next.<br>
<br> The implementation shall maintain one or more copies of
<code class="computeroutput">cb</code> until such time as the write operation no longer
requires access to the memory specified by the buffers in the sequence.
The program must ensure the memory is valid until:<br> <br>
— the last copy of <code class="computeroutput">cb</code> is destroyed, or<br> <br>
— the handler for the asynchronous write operation is invoked,<br>
<br> whichever comes first.<br> <br> If the total size of
all buffers in the sequence <code class="computeroutput">cb</code> is <code class="computeroutput">0</code>,
the asynchronous write operation shall complete immediately and
pass <code class="computeroutput">0</code> as the argument to the handler that specifies
the number of bytes written.
</p>
</td>
</tr>
</tbody>
</table></div>
</div>
<br class="table-break">
</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-2020 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="AsyncRandomAccessReadDevice.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="AsyncReadStream.html"><img src="../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,129 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Buffer-oriented asynchronous read stream requirements</title>
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../index.html" title="Asio">
<link rel="up" href="../reference.html" title="Reference">
<link rel="prev" href="AsyncRandomAccessWriteDevice.html" title="Buffer-oriented asynchronous random-access write device requirements">
<link rel="next" href="AsyncWriteStream.html" title="Buffer-oriented asynchronous write stream requirements">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="AsyncRandomAccessWriteDevice.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="AsyncWriteStream.html"><img src="../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="asio.reference.AsyncReadStream"></a><a class="link" href="AsyncReadStream.html" title="Buffer-oriented asynchronous read stream requirements">Buffer-oriented asynchronous
read stream requirements</a>
</h3></div></div></div>
<p>
A type <code class="computeroutput">X</code> meets the <code class="computeroutput">AsyncReadStream</code> requirements
if it satisfies the requirements listed below.
</p>
<p>
In the table below, <code class="computeroutput">a</code> denotes a value of type <code class="computeroutput">X</code>,
<code class="computeroutput">mb</code> denotes a (possibly const) value satisfying the <a class="link" href="MutableBufferSequence.html" title="Mutable buffer sequence requirements"><code class="computeroutput">MutableBufferSequence</code></a>
requirements, and <code class="computeroutput">t</code> is a completion token.
</p>
<div class="table">
<a name="asio.reference.AsyncReadStream.t0"></a><p class="title"><b>Table 4. AsyncReadStream requirements</b></p>
<div class="table-contents"><table class="table" summary="AsyncReadStream requirements">
<colgroup>
<col>
<col>
<col>
</colgroup>
<thead><tr>
<th>
<p>
operation
</p>
</th>
<th>
<p>
type
</p>
</th>
<th>
<p>
semantics, pre/post-conditions
</p>
</th>
</tr></thead>
<tbody>
<tr>
<td>
<p>
<code class="computeroutput">a.get_executor()</code>
</p>
</td>
<td>
<p>
A type satisfying the <a class="link" href="Executor1.html" title="Executor requirements">Executor
requirements</a>.
</p>
</td>
<td>
<p>
Returns the associated I/O executor.
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">a.async_read_some(mb,t)</code>
</p>
</td>
<td>
<p>
The return type is determined according to the requirements for
an <a class="link" href="asynchronous_operations.html" title="Requirements on asynchronous operations">asynchronous
operation</a>.
</p>
</td>
<td>
<p>
Meets the requirements for a <a class="link" href="read_write_operations.html" title="Requirements on read and write operations">read
operation</a> and an <a class="link" href="asynchronous_operations.html" title="Requirements on asynchronous operations">asynchronous
operation</a> with completion signature <code class="computeroutput">void(error_code
ec, size_t n)</code>.<br> <br> If <code class="computeroutput">buffer_size(mb) &gt;
0</code>, initiates an asynchronous operation to read one or more
bytes of data from the stream <code class="computeroutput">a</code> into the buffer sequence
<code class="computeroutput">mb</code>. If successful, <code class="computeroutput">ec</code> is set such that
<code class="computeroutput">!ec</code> is <code class="computeroutput">true</code>, and <code class="computeroutput">n</code> is the
number of bytes read. If an error occurred, <code class="computeroutput">ec</code> is
set such that <code class="computeroutput">!!ec</code> is <code class="computeroutput">true</code>, and <code class="computeroutput">n</code>
is 0. If all data has been read from the stream, and the stream
performed an orderly shutdown, <code class="computeroutput">ec</code> is <code class="computeroutput">stream_errc::eof</code>
and <code class="computeroutput">n</code> is 0.<br> <br> If <code class="computeroutput">buffer_size(mb)
== 0</code>, the operation completes immediately. <code class="computeroutput">ec</code>
is set such that <code class="computeroutput">!ec</code> is <code class="computeroutput">true</code>, and <code class="computeroutput">n</code>
is 0.
</p>
</td>
</tr>
</tbody>
</table></div>
</div>
<br class="table-break">
</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-2020 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="AsyncRandomAccessWriteDevice.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="AsyncWriteStream.html"><img src="../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,126 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Buffer-oriented asynchronous write stream requirements</title>
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../index.html" title="Asio">
<link rel="up" href="../reference.html" title="Reference">
<link rel="prev" href="AsyncReadStream.html" title="Buffer-oriented asynchronous read stream requirements">
<link rel="next" href="BufferedHandshakeHandler.html" title="Buffered handshake handler requirements">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="AsyncReadStream.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="BufferedHandshakeHandler.html"><img src="../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="asio.reference.AsyncWriteStream"></a><a class="link" href="AsyncWriteStream.html" title="Buffer-oriented asynchronous write stream requirements">Buffer-oriented asynchronous
write stream requirements</a>
</h3></div></div></div>
<p>
A type <code class="computeroutput">X</code> meets the <code class="computeroutput">AsyncWriteStream</code> requirements
if it satisfies the requirements listed below.
</p>
<p>
In the table below, <code class="computeroutput">a</code> denotes a value of type <code class="computeroutput">X</code>,
<code class="computeroutput">cb</code> denotes a (possibly const) value satisfying the <a class="link" href="ConstBufferSequence.html" title="Constant buffer sequence requirements"><code class="computeroutput">ConstBufferSequence</code></a>
requirements, and <code class="computeroutput">t</code> is a completion token.
</p>
<div class="table">
<a name="asio.reference.AsyncWriteStream.t0"></a><p class="title"><b>Table 5. AsyncWriteStream requirements</b></p>
<div class="table-contents"><table class="table" summary="AsyncWriteStream requirements">
<colgroup>
<col>
<col>
<col>
</colgroup>
<thead><tr>
<th>
<p>
operation
</p>
</th>
<th>
<p>
type
</p>
</th>
<th>
<p>
semantics, pre/post-conditions
</p>
</th>
</tr></thead>
<tbody>
<tr>
<td>
<p>
<code class="computeroutput">a.get_executor()</code>
</p>
</td>
<td>
<p>
A type satisfying the <a class="link" href="Executor1.html" title="Executor requirements">Executor
requirements</a>.
</p>
</td>
<td>
<p>
Returns the associated I/O executor.
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">a.async_write_some(cb,t)</code>
</p>
</td>
<td>
<p>
The return type is determined according to the requirements for
an <a class="link" href="asynchronous_operations.html" title="Requirements on asynchronous operations">asynchronous
operation</a>.
</p>
</td>
<td>
<p>
Meets the requirements for a <a class="link" href="read_write_operations.html" title="Requirements on read and write operations">write
operation</a> and an <a class="link" href="asynchronous_operations.html" title="Requirements on asynchronous operations">asynchronous
operation</a> with completion signature <code class="computeroutput">void(error_code
ec, size_t n)</code>.<br> <br> If <code class="computeroutput">buffer_size(cb) &gt;
0</code>, initiates an asynchronous operation to write one or more
bytes of data to the stream <code class="computeroutput">a</code> from the buffer sequence
<code class="computeroutput">cb</code>. If successful, <code class="computeroutput">ec</code> is set such that
<code class="computeroutput">!ec</code> is <code class="computeroutput">true</code>, and <code class="computeroutput">n</code> is the
number of bytes written. If an error occurred, <code class="computeroutput">ec</code>
is set such that <code class="computeroutput">!!ec</code> is <code class="computeroutput">true</code>, and <code class="computeroutput">n</code>
is 0.<br> <br> If <code class="computeroutput">buffer_size(cb) == 0</code>, the operation
completes immediately. <code class="computeroutput">ec</code> is set such that <code class="computeroutput">!ec</code>
is <code class="computeroutput">true</code>, and <code class="computeroutput">n</code> is 0.
</p>
</td>
</tr>
</tbody>
</table></div>
</div>
<br class="table-break">
</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-2020 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="AsyncReadStream.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="BufferedHandshakeHandler.html"><img src="../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,90 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Buffered handshake handler requirements</title>
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../index.html" title="Asio">
<link rel="up" href="../reference.html" title="Reference">
<link rel="prev" href="AsyncWriteStream.html" title="Buffer-oriented asynchronous write stream requirements">
<link rel="next" href="CompletionCondition.html" title="Completion condition requirements">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="AsyncWriteStream.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="CompletionCondition.html"><img src="../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="asio.reference.BufferedHandshakeHandler"></a><a class="link" href="BufferedHandshakeHandler.html" title="Buffered handshake handler requirements">Buffered handshake
handler requirements</a>
</h3></div></div></div>
<p>
A buffered handshake handler must meet the requirements for a <a class="link" href="Handler.html" title="Handlers">handler</a>.
A value <code class="computeroutput">h</code> of a buffered handshake handler class should work
correctly in the expression <code class="computeroutput">h(ec, s)</code>, where <code class="computeroutput">ec</code>
is an lvalue of type <code class="computeroutput">const error_code</code> and <code class="computeroutput">s</code> is
an lvalue of type <code class="computeroutput">const size_t</code>.
</p>
<h5>
<a name="asio.reference.BufferedHandshakeHandler.h0"></a>
<span><a name="asio.reference.BufferedHandshakeHandler.examples"></a></span><a class="link" href="BufferedHandshakeHandler.html#asio.reference.BufferedHandshakeHandler.examples">Examples</a>
</h5>
<p>
A free function as a buffered handshake handler:
</p>
<pre class="programlisting">void handshake_handler(
const asio::error_code&amp; ec,
std::size_t bytes_transferred)
{
...
}
</pre>
<p>
A buffered handshake handler function object:
</p>
<pre class="programlisting">struct handshake_handler
{
...
void operator()(
const asio::error_code&amp; ec,
std::size_t bytes_transferred)
{
...
}
...
};
</pre>
<p>
A non-static class member function adapted to a buffered handshake handler
using <code class="computeroutput">boost::bind()</code>:
</p>
<pre class="programlisting">void my_class::handshake_handler(
const asio::error_code&amp; ec,
std::size_t bytes_transferred)
{
...
}
...
socket.async_handshake(...,
boost::bind(&amp;my_class::handshake_handler,
this, asio::placeholders::error,
asio::placeholders::bytes_transferred));
</pre>
</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-2020 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="AsyncWriteStream.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="CompletionCondition.html"><img src="../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,106 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Completion condition requirements</title>
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../index.html" title="Asio">
<link rel="up" href="../reference.html" title="Reference">
<link rel="prev" href="BufferedHandshakeHandler.html" title="Buffered handshake handler requirements">
<link rel="next" href="CompletionHandler.html" title="Completion handler requirements">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="BufferedHandshakeHandler.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="CompletionHandler.html"><img src="../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="asio.reference.CompletionCondition"></a><a class="link" href="CompletionCondition.html" title="Completion condition requirements">Completion condition
requirements</a>
</h3></div></div></div>
<p>
A <span class="emphasis"><em>completion condition</em></span> is a function object that is
used with the algorithms <a class="link" href="read.html" title="read"><code class="computeroutput">read</code></a>,
<a class="link" href="async_read.html" title="async_read"><code class="computeroutput">async_read</code></a>,
<a class="link" href="write.html" title="write"><code class="computeroutput">write</code></a>, and <a class="link" href="async_write.html" title="async_write"><code class="computeroutput">async_write</code></a> to determine
when the algorithm has completed transferring data.
</p>
<p>
A type <code class="computeroutput">X</code> meets the <code class="computeroutput">CompletionCondition</code> requirements
if it satisfies the requirements of <code class="computeroutput">Destructible</code> (C++Std [destructible])
and <code class="computeroutput">MoveConstructible</code> (C++Std [moveconstructible]), as well
as the additional requirements listed below.
</p>
<p>
In the table below, <code class="computeroutput">x</code> denotes a value of type <code class="computeroutput">X</code>,
<code class="computeroutput">ec</code> denotes a (possibly const) value of type <code class="computeroutput">error_code</code>,
and <code class="computeroutput">n</code> denotes a (possibly const) value of type <code class="computeroutput">size_t</code>.
</p>
<div class="table">
<a name="asio.reference.CompletionCondition.t0"></a><p class="title"><b>Table 6. CompletionCondition requirements</b></p>
<div class="table-contents"><table class="table" summary="CompletionCondition requirements">
<colgroup>
<col>
<col>
<col>
</colgroup>
<thead><tr>
<th>
<p>
expression
</p>
</th>
<th>
<p>
return type
</p>
</th>
<th>
<p>
assertion/note<br> pre/post-condition
</p>
</th>
</tr></thead>
<tbody><tr>
<td>
<p>
<code class="computeroutput">x(ec, n)</code>
</p>
</td>
<td>
<p>
<code class="computeroutput">size_t</code>
</p>
</td>
<td>
<p>
Let <code class="computeroutput">n</code> be the total number of bytes transferred by
the read or write algorithm so far.<br> <br> Returns the maximum
number of bytes to be transferred on the next <code class="computeroutput">read_some</code>,
<code class="computeroutput">async_read_some</code>, <code class="computeroutput">write_some</code>, or <code class="computeroutput">async_write_some</code>
operation performed by the algorithm. Returns <code class="computeroutput">0</code> to
indicate that the algorithm is complete.
</p>
</td>
</tr></tbody>
</table></div>
</div>
<br class="table-break">
</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-2020 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="BufferedHandshakeHandler.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="CompletionHandler.html"><img src="../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,99 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Completion handler requirements</title>
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../index.html" title="Asio">
<link rel="up" href="../reference.html" title="Reference">
<link rel="prev" href="CompletionCondition.html" title="Completion condition requirements">
<link rel="next" href="ConnectCondition.html" title="Connect condition requirements">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="CompletionCondition.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="ConnectCondition.html"><img src="../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="asio.reference.CompletionHandler"></a><a class="link" href="CompletionHandler.html" title="Completion handler requirements">Completion handler
requirements</a>
</h3></div></div></div>
<p>
A completion handler must meet the requirements for a <a class="link" href="Handler.html" title="Handlers">handler</a>.
A value <code class="computeroutput">h</code> of a completion handler class should work correctly
in the expression <code class="computeroutput">h()</code>.
</p>
<h5>
<a name="asio.reference.CompletionHandler.h0"></a>
<span><a name="asio.reference.CompletionHandler.examples"></a></span><a class="link" href="CompletionHandler.html#asio.reference.CompletionHandler.examples">Examples</a>
</h5>
<p>
A free function as a completion handler:
</p>
<pre class="programlisting">void completion_handler()
{
...
}
</pre>
<p>
A completion handler function object:
</p>
<pre class="programlisting">struct completion_handler
{
...
void operator()()
{
...
}
...
};
</pre>
<p>
A lambda as a completion handler:
</p>
<pre class="programlisting">my_io_service.post(
[]()
{
...
});
</pre>
<p>
A non-static class member function adapted to a completion handler using
<code class="computeroutput">std::bind()</code>:
</p>
<pre class="programlisting">void my_class::completion_handler()
{
...
}
...
my_io_service.post(std::bind(&amp;my_class::completion_handler, this));
</pre>
<p>
A non-static class member function adapted to a completion handler using
<code class="computeroutput">boost::bind()</code>:
</p>
<pre class="programlisting">void my_class::completion_handler()
{
...
}
...
my_io_service.post(boost::bind(&amp;my_class::completion_handler, this));
</pre>
</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-2020 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="CompletionCondition.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="ConnectCondition.html"><img src="../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,99 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Connect condition requirements</title>
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../index.html" title="Asio">
<link rel="up" href="../reference.html" title="Reference">
<link rel="prev" href="CompletionHandler.html" title="Completion handler requirements">
<link rel="next" href="ConnectHandler.html" title="Connect handler requirements">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="CompletionHandler.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="ConnectHandler.html"><img src="../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="asio.reference.ConnectCondition"></a><a class="link" href="ConnectCondition.html" title="Connect condition requirements">Connect condition requirements</a>
</h3></div></div></div>
<p>
A type <code class="computeroutput">X</code> meets the <code class="computeroutput">ConnectCondition</code> requirements
if it satisfies the requirements of <code class="computeroutput">Destructible</code> (C++Std [destructible])
and <code class="computeroutput">CopyConstructible</code> (C++Std [copyconstructible]), as well
as the additional requirements listed below.
</p>
<p>
In the table below, <code class="computeroutput">x</code> denotes a value of type <code class="computeroutput">X</code>,
<code class="computeroutput">ec</code> denotes a (possibly const) value of type <code class="computeroutput">error_code</code>,
and <code class="computeroutput">ep</code> denotes a (possibly const) value of some type satisfying
the <a class="link" href="Endpoint.html" title="Endpoint requirements">endpoint</a> requirements.
</p>
<div class="table">
<a name="asio.reference.ConnectCondition.t0"></a><p class="title"><b>Table 7. ConnectCondition requirements</b></p>
<div class="table-contents"><table class="table" summary="ConnectCondition requirements">
<colgroup>
<col>
<col>
<col>
</colgroup>
<thead><tr>
<th>
<p>
expression
</p>
</th>
<th>
<p>
return type
</p>
</th>
<th>
<p>
assertion/note<br> pre/post-condition
</p>
</th>
</tr></thead>
<tbody><tr>
<td>
<p>
<code class="computeroutput">x(ec, ep)</code>
</p>
</td>
<td>
<p>
<code class="computeroutput">bool</code>
</p>
</td>
<td>
<p>
Returns <code class="computeroutput">true</code> to indicate that the <code class="computeroutput">connect</code>
or <code class="computeroutput">async_connect</code> algorithm should attempt a connection
to the endpoint <code class="computeroutput">ep</code>. Otherwise, returns <code class="computeroutput">false</code>
to indicate that the algorithm should not attempt connection to
the endpoint <code class="computeroutput">ep</code>, and should instead skip to the next
endpoint in the sequence.
</p>
</td>
</tr></tbody>
</table></div>
</div>
<br class="table-break">
</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-2020 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="CompletionHandler.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="ConnectHandler.html"><img src="../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,105 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Connect handler requirements</title>
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../index.html" title="Asio">
<link rel="up" href="../reference.html" title="Reference">
<link rel="prev" href="ConnectCondition.html" title="Connect condition requirements">
<link rel="next" href="ConstBufferSequence.html" title="Constant buffer sequence requirements">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="ConnectCondition.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="ConstBufferSequence.html"><img src="../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="asio.reference.ConnectHandler"></a><a class="link" href="ConnectHandler.html" title="Connect handler requirements">Connect handler requirements</a>
</h3></div></div></div>
<p>
A connect handler must meet the requirements for a <a class="link" href="Handler.html" title="Handlers">handler</a>.
A value <code class="computeroutput">h</code> of a connect handler class should work correctly in
the expression <code class="computeroutput">h(ec)</code>, where <code class="computeroutput">ec</code> is an lvalue of
type <code class="computeroutput">const error_code</code>.
</p>
<h5>
<a name="asio.reference.ConnectHandler.h0"></a>
<span><a name="asio.reference.ConnectHandler.examples"></a></span><a class="link" href="ConnectHandler.html#asio.reference.ConnectHandler.examples">Examples</a>
</h5>
<p>
A free function as a connect handler:
</p>
<pre class="programlisting">void connect_handler(
const asio::error_code&amp; ec)
{
...
}
</pre>
<p>
A connect handler function object:
</p>
<pre class="programlisting">struct connect_handler
{
...
void operator()(
const asio::error_code&amp; ec)
{
...
}
...
};
</pre>
<p>
A lambda as a connect handler:
</p>
<pre class="programlisting">socket.async_connect(...,
[](const asio::error_code&amp; ec)
{
...
});
</pre>
<p>
A non-static class member function adapted to a connect handler using <code class="computeroutput">std::bind()</code>:
</p>
<pre class="programlisting">void my_class::connect_handler(
const asio::error_code&amp; ec)
{
...
}
...
socket.async_connect(...,
std::bind(&amp;my_class::connect_handler,
this, std::placeholders::_1));
</pre>
<p>
A non-static class member function adapted to a connect handler using <code class="computeroutput">boost::bind()</code>:
</p>
<pre class="programlisting">void my_class::connect_handler(
const asio::error_code&amp; ec)
{
...
}
...
socket.async_connect(...,
boost::bind(&amp;my_class::connect_handler,
this, asio::placeholders::error));
</pre>
</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-2020 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="ConnectCondition.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="ConstBufferSequence.html"><img src="../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,130 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Constant buffer sequence requirements</title>
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../index.html" title="Asio">
<link rel="up" href="../reference.html" title="Reference">
<link rel="prev" href="ConnectHandler.html" title="Connect handler requirements">
<link rel="next" href="DynamicBuffer.html" title="Dynamic buffer requirements">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="ConnectHandler.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="DynamicBuffer.html"><img src="../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="asio.reference.ConstBufferSequence"></a><a class="link" href="ConstBufferSequence.html" title="Constant buffer sequence requirements">Constant buffer sequence
requirements</a>
</h3></div></div></div>
<p>
A <span class="emphasis"><em>constant buffer sequence</em></span> represents a set of memory
regions that may be used as input to an operation, such as the <code class="computeroutput">send</code>
operation of a socket.
</p>
<p>
A type <code class="computeroutput">X</code> meets the <code class="computeroutput">ConstBufferSequence</code> requirements
if it satisfies the requirements of <code class="computeroutput">Destructible</code> (C++Std [destructible])
and <code class="computeroutput">CopyConstructible</code> (C++Std [copyconstructible]), as well
as the additional requirements listed below.
</p>
<p>
In the table below, <code class="computeroutput">x</code> denotes a (possibly const) value of type
<code class="computeroutput">X</code>, and <code class="computeroutput">u</code> denotes an identifier.
</p>
<div class="table">
<a name="asio.reference.ConstBufferSequence.t0"></a><p class="title"><b>Table 8. ConstBufferSequence requirements</b></p>
<div class="table-contents"><table class="table" summary="ConstBufferSequence requirements">
<colgroup>
<col>
<col>
<col>
</colgroup>
<thead><tr>
<th>
<p>
expression
</p>
</th>
<th>
<p>
return type
</p>
</th>
<th>
<p>
assertion/note<br> pre/post-condition
</p>
</th>
</tr></thead>
<tbody>
<tr>
<td>
<p>
<code class="computeroutput">asio::buffer_sequence_begin(x)</code><br> <code class="computeroutput">asio::buffer_sequence_end(x)</code>
</p>
</td>
<td>
<p>
An iterator type meeting the requirements for bidirectional iterators
(C++Std [bidirectional.iterators]) whose value type is convertible
to <code class="computeroutput">const_buffer</code>.
</p>
</td>
<td>
</td>
</tr>
<tr>
<td>
<p>
</p>
<pre class="programlisting">X u(x);
</pre>
<p>
</p>
</td>
<td>
</td>
<td>
<p>
post:<br>
</p>
<pre class="programlisting">equal(
asio::buffer_sequence_begin(x),
asio::buffer_sequence_end(x),
asio::buffer_sequence_begin(u),
asio::buffer_sequence_end(u),
[](const const_buffer&amp; b1,
const const_buffer&amp; b2)
{
return b1.data() == b2.data()
&amp;&amp; b1.size() == b2.size();
})
</pre>
<p>
</p>
</td>
</tr>
</tbody>
</table></div>
</div>
<br class="table-break">
</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-2020 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="ConnectHandler.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="DynamicBuffer.html"><img src="../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,50 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Dynamic buffer requirements</title>
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../index.html" title="Asio">
<link rel="up" href="../reference.html" title="Reference">
<link rel="prev" href="ConstBufferSequence.html" title="Constant buffer sequence requirements">
<link rel="next" href="DynamicBuffer_v1.html" title="Dynamic buffer requirements (version 1)">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="ConstBufferSequence.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="DynamicBuffer_v1.html"><img src="../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="asio.reference.DynamicBuffer"></a><a class="link" href="DynamicBuffer.html" title="Dynamic buffer requirements">Dynamic buffer requirements</a>
</h3></div></div></div>
<p>
See:
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem">
<a class="link" href="DynamicBuffer_v1.html" title="Dynamic buffer requirements (version 1)">Dynamic buffer requirements
(version 1)</a>
</li>
<li class="listitem">
<a class="link" href="DynamicBuffer_v2.html" title="Dynamic buffer requirements (version 2)">Dynamic buffer requirements
(version 2)</a>
</li>
</ul></div>
</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-2020 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="ConstBufferSequence.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="DynamicBuffer_v1.html"><img src="../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,258 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Dynamic buffer requirements (version 1)</title>
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../index.html" title="Asio">
<link rel="up" href="../reference.html" title="Reference">
<link rel="prev" href="DynamicBuffer.html" title="Dynamic buffer requirements">
<link rel="next" href="DynamicBuffer_v2.html" title="Dynamic buffer requirements (version 2)">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="DynamicBuffer.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="DynamicBuffer_v2.html"><img src="../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="asio.reference.DynamicBuffer_v1"></a><a class="link" href="DynamicBuffer_v1.html" title="Dynamic buffer requirements (version 1)">Dynamic buffer requirements
(version 1)</a>
</h3></div></div></div>
<p>
A dynamic buffer encapsulates memory storage that may be automatically resized
as required, where the memory is divided into an input sequence followed
by an output sequence. These memory regions are internal to the dynamic buffer
sequence, but direct access to the elements is provided to permit them to
be efficiently used with I/O operations, such as the <code class="computeroutput">send</code> or
<code class="computeroutput">receive</code> operations of a socket. Data written to the output sequence
of a dynamic buffer sequence object is appended to the input sequence of
the same object.
</p>
<p>
A dynamic buffer type <code class="computeroutput">X</code> shall satisfy the requirements of <code class="computeroutput">MoveConstructible</code>
(C++ Std, [moveconstructible]) types in addition to those listed below.
</p>
<p>
In the table below, <code class="computeroutput">X</code> denotes a dynamic buffer class, <code class="computeroutput">x</code>
denotes a value of type <code class="computeroutput">X&amp;</code>, <code class="computeroutput">x1</code> denotes values
of type <code class="computeroutput">const X&amp;</code>, and <code class="computeroutput">n</code> denotes a value of
type <code class="computeroutput">size_t</code>, and <code class="computeroutput">u</code> denotes an identifier.
</p>
<div class="table">
<a name="asio.reference.DynamicBuffer_v1.t0"></a><p class="title"><b>Table 9. DynamicBuffer_v1 requirements</b></p>
<div class="table-contents"><table class="table" summary="DynamicBuffer_v1 requirements">
<colgroup>
<col>
<col>
<col>
</colgroup>
<thead><tr>
<th>
<p>
expression
</p>
</th>
<th>
<p>
type
</p>
</th>
<th>
<p>
assertion/note<br> pre/post-conditions
</p>
</th>
</tr></thead>
<tbody>
<tr>
<td>
<p>
<code class="computeroutput">X::const_buffers_type</code>
</p>
</td>
<td>
<p>
type meeting <a class="link" href="ConstBufferSequence.html" title="Constant buffer sequence requirements">ConstBufferSequence</a>
requirements.
</p>
</td>
<td>
<p>
This type represents the memory associated with the input sequence.
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">X::mutable_buffers_type</code>
</p>
</td>
<td>
<p>
type meeting <a class="link" href="MutableBufferSequence.html" title="Mutable buffer sequence requirements">MutableBufferSequence</a>
requirements.
</p>
</td>
<td>
<p>
This type represents the memory associated with the output sequence.
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">x1.size()</code>
</p>
</td>
<td>
<p>
<code class="computeroutput">size_t</code>
</p>
</td>
<td>
<p>
Returns the size, in bytes, of the input sequence.
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">x1.max_size()</code>
</p>
</td>
<td>
<p>
<code class="computeroutput">size_t</code>
</p>
</td>
<td>
<p>
Returns the permitted maximum of the sum of the sizes of the input
sequence and output sequence.
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">x1.capacity()</code>
</p>
</td>
<td>
<p>
<code class="computeroutput">size_t</code>
</p>
</td>
<td>
<p>
Returns the maximum sum of the sizes of the input sequence and
output sequence that the dynamic buffer can hold without requiring
reallocation.
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">x1.data()</code>
</p>
</td>
<td>
<p>
<code class="computeroutput">X::const_buffers_type</code>
</p>
</td>
<td>
<p>
Returns a constant buffer sequence <code class="computeroutput">u</code> that represents
the memory associated with the input sequence, and where <code class="computeroutput">buffer_size(u)
== size()</code>.
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">x.prepare(n)</code>
</p>
</td>
<td>
<p>
<code class="computeroutput">X::mutable_buffers_type</code>
</p>
</td>
<td>
<p>
Requires: <code class="computeroutput">size() + n &lt;= max_size()</code>.<br> <br>
Returns a mutable buffer sequence <code class="computeroutput">u</code> representing the
output sequence, and where <code class="computeroutput">buffer_size(u) == n</code>. The
dynamic buffer reallocates memory as required. All constant or
mutable buffer sequences previously obtained using <code class="computeroutput">data()</code>
or <code class="computeroutput">prepare()</code> are invalidated.<br> <br> Throws:
<code class="computeroutput">length_error</code> if <code class="computeroutput">size() + n &gt; max_size()</code>.
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">x.commit(n)</code>
</p>
</td>
<td>
</td>
<td>
<p>
Appends <code class="computeroutput">n</code> bytes from the start of the output sequence
to the end of the input sequence. The remainder of the output sequence
is discarded. If <code class="computeroutput">n</code> is greater than the size of the
output sequence, the entire output sequence is appended to the
input sequence. All constant or mutable buffer sequences previously
obtained using <code class="computeroutput">data()</code> or <code class="computeroutput">prepare()</code> are
invalidated.
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">x.consume(n)</code>
</p>
</td>
<td>
</td>
<td>
<p>
Removes <code class="computeroutput">n</code> bytes from beginning of the input sequence.
If <code class="computeroutput">n</code> is greater than the size of the input sequence,
the entire input sequence is removed. All constant or mutable buffer
sequences previously obtained using <code class="computeroutput">data()</code> or <code class="computeroutput">prepare()</code>
are invalidated.
</p>
</td>
</tr>
</tbody>
</table></div>
</div>
<br class="table-break">
</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-2020 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="DynamicBuffer.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="DynamicBuffer_v2.html"><img src="../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,265 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Dynamic buffer requirements (version 2)</title>
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../index.html" title="Asio">
<link rel="up" href="../reference.html" title="Reference">
<link rel="prev" href="DynamicBuffer_v1.html" title="Dynamic buffer requirements (version 1)">
<link rel="next" href="Endpoint.html" title="Endpoint requirements">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="DynamicBuffer_v1.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="Endpoint.html"><img src="../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="asio.reference.DynamicBuffer_v2"></a><a class="link" href="DynamicBuffer_v2.html" title="Dynamic buffer requirements (version 2)">Dynamic buffer requirements
(version 2)</a>
</h3></div></div></div>
<p>
A dynamic buffer encapsulates memory storage that may be automatically resized
as required.
</p>
<p>
A dynamic buffer type <code class="computeroutput">X</code> shall satisfy the requirements of <code class="computeroutput">CopyConstructible</code>
(C++ Std, [copyconstructible]) types in addition to those listed below.
</p>
<p>
In the table below, <code class="computeroutput">X</code> denotes a dynamic buffer class, <code class="computeroutput">x</code>
denotes a value of type <code class="computeroutput">X&amp;</code>, <code class="computeroutput">x1</code> denotes values
of type <code class="computeroutput">const X&amp;</code>, <code class="computeroutput">pos</code> and <code class="computeroutput">n</code> denote
values of type <code class="computeroutput">size_t</code>, and <code class="computeroutput">u</code> denotes an identifier.
</p>
<div class="table">
<a name="asio.reference.DynamicBuffer_v2.t0"></a><p class="title"><b>Table 10. DynamicBuffer_v2 requirements</b></p>
<div class="table-contents"><table class="table" summary="DynamicBuffer_v2 requirements">
<colgroup>
<col>
<col>
<col>
</colgroup>
<thead><tr>
<th>
<p>
expression
</p>
</th>
<th>
<p>
type
</p>
</th>
<th>
<p>
assertion/note<br> pre/post-conditions
</p>
</th>
</tr></thead>
<tbody>
<tr>
<td>
<p>
<code class="computeroutput">X::const_buffers_type</code>
</p>
</td>
<td>
<p>
type meeting <a class="link" href="ConstBufferSequence.html" title="Constant buffer sequence requirements">ConstBufferSequence</a>
requirements.
</p>
</td>
<td>
<p>
This type represents the underlying memory as a sequence of @c
const_buffer objects.
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">X::mutable_buffers_type</code>
</p>
</td>
<td>
<p>
type meeting <a class="link" href="MutableBufferSequence.html" title="Mutable buffer sequence requirements">MutableBufferSequence</a>
requirements.
</p>
</td>
<td>
<p>
This type represents the underlying memory as a sequence of @c
mutable_buffer objects.
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">x1.size()</code>
</p>
</td>
<td>
<p>
<code class="computeroutput">size_t</code>
</p>
</td>
<td>
<p>
Returns the size, in bytes, of the underlying memory.
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">x1.max_size()</code>
</p>
</td>
<td>
<p>
<code class="computeroutput">size_t</code>
</p>
</td>
<td>
<p>
Returns the permitted maximum size of the underlying memory.
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">x1.capacity()</code>
</p>
</td>
<td>
<p>
<code class="computeroutput">size_t</code>
</p>
</td>
<td>
<p>
Returns the maximum size to which the underlying memory can grow
without requiring reallocation.
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">x1.data(pos, n)</code>
</p>
</td>
<td>
<p>
<code class="computeroutput">X::const_buffers_type</code>
</p>
</td>
<td>
<p>
Returns a constant buffer sequence <code class="computeroutput">u</code> that represents
the underlying memory beginning at offset <code class="computeroutput">pos</code>, and
where <code class="computeroutput">buffer_size(u) &lt;= n</code>.
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">x.data(pos, n)</code>
</p>
</td>
<td>
<p>
<code class="computeroutput">X::mutable_buffers_type</code>
</p>
</td>
<td>
<p>
Returns a mutable buffer sequence <code class="computeroutput">u</code> that represents
the underlying memory beginning at offset <code class="computeroutput">pos</code>, and
where <code class="computeroutput">buffer_size(u) &lt;= n</code>.
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">x.grow(n)</code>
</p>
</td>
<td>
</td>
<td>
<p>
Requires: <code class="computeroutput">size() + n &lt;= max_size()</code>.<br> <br>
Extends the underlying memory to accommodate <code class="computeroutput">n</code> additional
bytes at the end. The dynamic buffer reallocates memory as required.
All constant or mutable buffer sequences previously obtained using
<code class="computeroutput">data()</code> are invalidated.<br> <br> Throws: <code class="computeroutput">length_error</code>
if <code class="computeroutput">size() + n &gt; max_size()</code>.
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">x.shrink(n)</code>
</p>
</td>
<td>
</td>
<td>
<p>
Removes <code class="computeroutput">n</code> bytes from the end of the underlying memory.
If <code class="computeroutput">n</code> is greater than the size of the underlying memory,
the entire underlying memory is emptied. All constant or mutable
buffer sequences previously obtained using <code class="computeroutput">data()</code>
are invalidated.
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">x.consume(n)</code>
</p>
</td>
<td>
</td>
<td>
<p>
Removes <code class="computeroutput">n</code> bytes from the beginning of the underlying
memory. If <code class="computeroutput">n</code> is greater than the size of the underlying
memory, the entire underlying memory is emptied. All constant or
mutable buffer sequences previously obtained using <code class="computeroutput">data()</code>
are invalidated.
</p>
</td>
</tr>
</tbody>
</table></div>
</div>
<br class="table-break">
</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-2020 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="DynamicBuffer_v1.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="Endpoint.html"><img src="../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,256 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Endpoint requirements</title>
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../index.html" title="Asio">
<link rel="up" href="../reference.html" title="Reference">
<link rel="prev" href="DynamicBuffer_v2.html" title="Dynamic buffer requirements (version 2)">
<link rel="next" href="EndpointSequence.html" title="Endpoint sequence requirements">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="DynamicBuffer_v2.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="EndpointSequence.html"><img src="../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="asio.reference.Endpoint"></a><a class="link" href="Endpoint.html" title="Endpoint requirements">Endpoint requirements</a>
</h3></div></div></div>
<p>
A type <code class="computeroutput">X</code> meets the <code class="computeroutput">Endpoint</code> requirements if it
satisfies the requirements of <code class="computeroutput">Destructible</code> (C++Std [destructible]),
<code class="computeroutput">DefaultConstructible</code> (C++Std [defaultconstructible]), <code class="computeroutput">CopyConstructible</code>
(C++Std [copyconstructible]), and <code class="computeroutput">CopyAssignable</code> (C++Std [copyassignable]),
as well as the additional requirements listed below.
</p>
<p>
The default constructor and move operations of the type <code class="computeroutput">X</code> shall
not exit via an exception.
</p>
<p>
In the table below, <code class="computeroutput">a</code> denotes a (possibly const) value of type
<code class="computeroutput">X</code>, and <code class="computeroutput">u</code> denotes an identifier.
</p>
<div class="table">
<a name="asio.reference.Endpoint.t0"></a><p class="title"><b>Table 11. Endpoint requirements</b></p>
<div class="table-contents"><table class="table" summary="Endpoint requirements">
<colgroup>
<col>
<col>
<col>
</colgroup>
<thead><tr>
<th>
<p>
expression
</p>
</th>
<th>
<p>
type
</p>
</th>
<th>
<p>
assertion/note<br> pre/post-conditions
</p>
</th>
</tr></thead>
<tbody>
<tr>
<td>
<p>
<code class="computeroutput">X::protocol_type</code>
</p>
</td>
<td>
<p>
type meeting <a class="link" href="Protocol.html" title="Protocol requirements"><code class="computeroutput">Protocol</code></a>
requirements
</p>
</td>
<td>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">a.protocol()</code>
</p>
</td>
<td>
<p>
<code class="computeroutput">protocol_type</code>
</p>
</td>
<td>
</td>
</tr>
</tbody>
</table></div>
</div>
<br class="table-break"><p>
In the table below, <code class="computeroutput">a</code> denotes a (possibly const) value of type
<code class="computeroutput">X</code>, <code class="computeroutput">b</code> denotes a value of type <code class="computeroutput">X</code>, and
<code class="computeroutput">s</code> denotes a (possibly const) value of a type that is convertible
to <code class="computeroutput">size_t</code> and denotes a size in bytes.
</p>
<div class="table">
<a name="asio.reference.Endpoint.t1"></a><p class="title"><b>Table 12. Endpoint requirements for extensible implementations</b></p>
<div class="table-contents"><table class="table" summary="Endpoint requirements for extensible implementations">
<colgroup>
<col>
<col>
<col>
</colgroup>
<thead><tr>
<th>
<p>
expression
</p>
</th>
<th>
<p>
type
</p>
</th>
<th>
<p>
assertion/note<br> pre/post-conditions
</p>
</th>
</tr></thead>
<tbody>
<tr>
<td>
<p>
<code class="computeroutput">a.data()</code>
</p>
</td>
<td>
<p>
<code class="computeroutput">const void*</code>
</p>
</td>
<td>
<p>
Returns a pointer suitable for passing as the <span class="emphasis"><em>address</em></span>
argument to functions such as <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/connect.html" target="_top"><code class="computeroutput"><span class="identifier">connect</span><span class="special">()</span></code></a>,
or as the <span class="emphasis"><em>dest_addr</em></span> argument to functions
such as <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/sendto.html" target="_top"><code class="computeroutput"><span class="identifier">sendto</span><span class="special">()</span></code></a>.
The implementation shall perform a <code class="computeroutput">static_cast</code> on
the pointer to convert it to <code class="computeroutput">const sockaddr*</code>.
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">b.data()</code>
</p>
</td>
<td>
<p>
<code class="computeroutput">void*</code>
</p>
</td>
<td>
<p>
Returns a pointer suitable for passing as the <span class="emphasis"><em>address</em></span>
argument to functions such as <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/accept.html" target="_top"><code class="computeroutput"><span class="identifier">accept</span><span class="special">()</span></code></a>,
<a href="http://www.opengroup.org/onlinepubs/9699919799/functions/getpeername.html" target="_top"><code class="computeroutput"><span class="identifier">getpeername</span><span class="special">()</span></code></a>,
<a href="http://www.opengroup.org/onlinepubs/9699919799/functions/getsockname.html" target="_top"><code class="computeroutput"><span class="identifier">getsockname</span><span class="special">()</span></code></a>
and <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/recvfrom.html" target="_top"><code class="computeroutput"><span class="identifier">recvfrom</span><span class="special">()</span></code></a>.
The implementation shall perform a <code class="computeroutput">static_cast</code> on
the pointer to convert it to <code class="computeroutput">sockaddr*</code>.
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">a.size()</code>
</p>
</td>
<td>
<p>
<code class="computeroutput">size_t</code>
</p>
</td>
<td>
<p>
Returns a value suitable for passing as the <span class="emphasis"><em>address_len</em></span>
argument to functions such as <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/connect.html" target="_top"><code class="computeroutput"><span class="identifier">connect</span><span class="special">()</span></code></a>,
or as the <span class="emphasis"><em>dest_len</em></span> argument to functions such
as <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/sendto.html" target="_top"><code class="computeroutput"><span class="identifier">sendto</span><span class="special">()</span></code></a>,
after appropriate integer conversion has been performed.
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">b.resize(s)</code>
</p>
</td>
<td>
</td>
<td>
<p>
pre: <code class="computeroutput">s &gt;= 0</code><br> post: <code class="computeroutput">a.size() == s</code><br>
Passed the value contained in the <span class="emphasis"><em>address_len</em></span>
argument to functions such as <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/accept.html" target="_top"><code class="computeroutput"><span class="identifier">accept</span><span class="special">()</span></code></a>,
<a href="http://www.opengroup.org/onlinepubs/9699919799/functions/getpeername.html" target="_top"><code class="computeroutput"><span class="identifier">getpeername</span><span class="special">()</span></code></a>,
<a href="http://www.opengroup.org/onlinepubs/9699919799/functions/getsockname.html" target="_top"><code class="computeroutput"><span class="identifier">getsockname</span><span class="special">()</span></code></a>
and <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/recvfrom.html" target="_top"><code class="computeroutput"><span class="identifier">recvfrom</span><span class="special">()</span></code></a>,
after successful completion of the function. Permitted to throw
an exception if the protocol associated with the endpoint object
<code class="computeroutput">a</code> does not support the specified size.
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">a.capacity()</code>
</p>
</td>
<td>
<p>
<code class="computeroutput">size_t</code>
</p>
</td>
<td>
<p>
Returns a value suitable for passing as the <span class="emphasis"><em>address_len</em></span>
argument to functions such as <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/accept.html" target="_top"><code class="computeroutput"><span class="identifier">accept</span><span class="special">()</span></code></a>,
<a href="http://www.opengroup.org/onlinepubs/9699919799/functions/getpeername.html" target="_top"><code class="computeroutput"><span class="identifier">getpeername</span><span class="special">()</span></code></a>,
<a href="http://www.opengroup.org/onlinepubs/9699919799/functions/getsockname.html" target="_top"><code class="computeroutput"><span class="identifier">getsockname</span><span class="special">()</span></code></a>
and <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/recvfrom.html" target="_top"><code class="computeroutput"><span class="identifier">recvfrom</span><span class="special">()</span></code></a>,
after appropriate integer conversion has been performed.
</p>
</td>
</tr>
</tbody>
</table></div>
</div>
<br class="table-break">
</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-2020 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="DynamicBuffer_v2.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="EndpointSequence.html"><img src="../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,94 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Endpoint sequence requirements</title>
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../index.html" title="Asio">
<link rel="up" href="../reference.html" title="Reference">
<link rel="prev" href="Endpoint.html" title="Endpoint requirements">
<link rel="next" href="ExecutionContext.html" title="Execution context requirements">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="Endpoint.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="ExecutionContext.html"><img src="../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="asio.reference.EndpointSequence"></a><a class="link" href="EndpointSequence.html" title="Endpoint sequence requirements">Endpoint sequence requirements</a>
</h3></div></div></div>
<p>
A type <code class="computeroutput">X</code> meets the <code class="computeroutput">EndpointSequence</code> requirements
if it satisfies the requirements of <code class="computeroutput">Destructible</code> (C++Std [destructible])
and <code class="computeroutput">CopyConstructible</code> (C++Std [copyconstructible]), as well
as the additional requirements listed below.
</p>
<p>
In the table below, <code class="computeroutput">x</code> denotes a (possibly const) value of type
<code class="computeroutput">X</code>.
</p>
<div class="table">
<a name="asio.reference.EndpointSequence.t0"></a><p class="title"><b>Table 13. EndpointSequence requirements</b></p>
<div class="table-contents"><table class="table" summary="EndpointSequence requirements">
<colgroup>
<col>
<col>
<col>
</colgroup>
<thead><tr>
<th>
<p>
expression
</p>
</th>
<th>
<p>
return type
</p>
</th>
<th>
<p>
assertion/note<br> pre/post-condition
</p>
</th>
</tr></thead>
<tbody><tr>
<td>
<p>
<code class="computeroutput">x.begin()</code><br> <code class="computeroutput">x.end()</code>
</p>
</td>
<td>
<p>
A type meeting the requirements for forward iterators (C++Std [forward.iterators])
whose value type is convertible to a type satisfying the <a class="link" href="Endpoint.html" title="Endpoint requirements"><code class="computeroutput">Endpoint</code></a>
requirements.
</p>
</td>
<td>
<p>
[<code class="computeroutput">x.begin()</code>,<code class="computeroutput">x.end()</code>) is a valid range.
</p>
</td>
</tr></tbody>
</table></div>
</div>
<br class="table-break">
</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-2020 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="Endpoint.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="ExecutionContext.html"><img src="../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,123 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Execution context requirements</title>
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../index.html" title="Asio">
<link rel="up" href="../reference.html" title="Reference">
<link rel="prev" href="EndpointSequence.html" title="Endpoint sequence requirements">
<link rel="next" href="Executor1.html" title="Executor requirements">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="EndpointSequence.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="Executor1.html"><img src="../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="asio.reference.ExecutionContext"></a><a class="link" href="ExecutionContext.html" title="Execution context requirements">Execution context requirements</a>
</h3></div></div></div>
<p>
A type <code class="computeroutput">X</code> meets the <code class="computeroutput">ExecutionContext</code> requirements
if it is publicly and unambiguously derived from <code class="computeroutput">execution_context</code>,
and satisfies the additional requirements listed below.
</p>
<p>
In the table below, <code class="computeroutput">x</code> denotes a value of type <code class="computeroutput">X</code>.
</p>
<div class="table">
<a name="asio.reference.ExecutionContext.t0"></a><p class="title"><b>Table 14. ExecutionContext requirements</b></p>
<div class="table-contents"><table class="table" summary="ExecutionContext requirements">
<colgroup>
<col>
<col>
<col>
</colgroup>
<thead><tr>
<th>
<p>
expression
</p>
</th>
<th>
<p>
return type
</p>
</th>
<th>
<p>
assertion/note<br> pre/post-condition
</p>
</th>
</tr></thead>
<tbody>
<tr>
<td>
<p>
<code class="computeroutput">X::executor_type</code>
</p>
</td>
<td>
<p>
type meeting <a class="link" href="Executor1.html" title="Executor requirements"><code class="computeroutput">Executor</code></a>
requirements
</p>
</td>
<td>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">x.~X()</code>
</p>
</td>
<td>
</td>
<td>
<p>
Destroys all unexecuted function objects that were submitted via
an executor object that is associated with the execution context.
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">x.get_executor()</code>
</p>
</td>
<td>
<p>
<code class="computeroutput">X::executor_type</code>
</p>
</td>
<td>
<p>
Returns an executor object that is associated with the execution
context.
</p>
</td>
</tr>
</tbody>
</table></div>
</div>
<br class="table-break">
</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-2020 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="EndpointSequence.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="Executor1.html"><img src="../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,404 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Executor requirements</title>
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../index.html" title="Asio">
<link rel="up" href="../reference.html" title="Reference">
<link rel="prev" href="ExecutionContext.html" title="Execution context requirements">
<link rel="next" href="GettableSerialPortOption.html" title="Gettable serial port option requirements">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="ExecutionContext.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="GettableSerialPortOption.html"><img src="../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="asio.reference.Executor1"></a><a class="link" href="Executor1.html" title="Executor requirements">Executor requirements</a>
</h3></div></div></div>
<h5>
<a name="asio.reference.Executor1.h0"></a>
<span><a name="asio.reference.Executor1.standard_executors"></a></span><a class="link" href="Executor1.html#asio.reference.Executor1.standard_executors">Standard
executors</a>
</h5>
<p>
Let <code class="computeroutput">executor-of-impl</code> be the exposition-only concept
</p>
<pre class="programlisting">template&lt;class E, class F&gt;
concept executor-of-impl =
invocable&lt;decay_t&lt;F&gt;&amp;&gt; &amp;&amp;
constructible_from&lt;decay_t&lt;F&gt;, F&gt; &amp;&amp;
move_constructible&lt;decay_t&lt;F&gt;&gt; &amp;&amp;
copy_constructible&lt;E&gt; &amp;&amp;
is_nothrow_copy_constructible_v&lt;E&gt; &amp;&amp;
equality_comparable&lt;E&gt; /* nothrow */ &amp;&amp;
requires(const E&amp; e, F&amp;&amp; f) {
execution::execute(e, (F&amp;&amp;)f);
};
</pre>
<p>
Then the <code class="computeroutput">executor</code> and <code class="computeroutput">executor_of</code> concepts are
defined as follows:
</p>
<pre class="programlisting">template&lt;class E&gt;
concept executor =
executor-of-impl&lt;E, execution::invocable_archetype&gt;;
template&lt;class E, class F&gt;
concept executor_of =
executor&lt;E&gt; &amp;&amp;
executor-of-impl&lt;E, F&gt;;
</pre>
<p>
Neither an executor's equality comparison nor <code class="computeroutput">swap</code> operation
shall exit via an exception.
</p>
<p>
None of an executor type's copy constructor, destructor, equality comparison,
<code class="computeroutput">swap</code> function, <code class="computeroutput">execute</code> function, or associated
<code class="computeroutput">query</code> functions shall introduce data races as a result of concurrent
invocations of those functions from different threads.
</p>
<p>
For any two (possibly const) values <code class="computeroutput">x1</code> and <code class="computeroutput">x2</code> of
some executor type <code class="computeroutput">X</code>, <code class="computeroutput">x1 == x2</code> shall return <code class="computeroutput">true</code>
only if <code class="computeroutput">asio::query(x1,p) == asio::query(x2,p)</code> for every property
<code class="computeroutput">p</code> where both <code class="computeroutput">asio::query(x1,p)</code> and <code class="computeroutput">asio::query(x2,p)</code>
are well-formed and result in a non-void type that is <code class="computeroutput">equality_comparable</code>
(C++Std [equalitycomparable]). [<span class="emphasis"><em>Note:</em></span> The above requirements
imply that <code class="computeroutput">x1 == x2</code> returns <code class="computeroutput">true</code> if <code class="computeroutput">x1</code>
and <code class="computeroutput">x2</code> can be interchanged with identical effects. An executor
may conceptually contain additional properties which are not exposed by a
named property type that can be observed via <code class="computeroutput">asio::query</code>; in
this case, it is up to the concrete executor implementation to decide if
these properties affect equality. Returning <code class="computeroutput">false</code> does not necessarily
imply that the effects are not identical. —<span class="emphasis"><em>end note</em></span>]
</p>
<p>
An executor type's destructor shall not block pending completion of the submitted
function objects. [<span class="emphasis"><em>Note:</em></span> The ability to wait for completion
of submitted function objects may be provided by the associated execution
context. —<span class="emphasis"><em>end note</em></span>]
</p>
<p>
In addition to the above requirements, types <code class="computeroutput">E</code> and <code class="computeroutput">F</code>
model <code class="computeroutput">executor_of</code> only if they satisfy the requirements of the
Table below.
</p>
<p>
Let:
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem">
<code class="computeroutput">e</code> denotes a (possibly const) executor object of type <code class="computeroutput">E</code>,
</li>
<li class="listitem">
<code class="computeroutput">cf</code> denotes the function object <code class="computeroutput">DECAY_COPY(std::forward&lt;F&gt;(f))</code>
</li>
<li class="listitem">
<code class="computeroutput">f</code> denotes a function of type <code class="computeroutput">F&amp;&amp;</code> invocable
as <code class="computeroutput">cf()</code> and where <code class="computeroutput">decay_t&lt;F&gt;</code> models
<code class="computeroutput">move_constructible</code>.
</li>
</ul></div>
<p>
The expression <code class="computeroutput">execution::execute(e, f)</code>:
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem">
Evaluates <code class="computeroutput">DECAY_COPY(std::forward&lt;F&gt;(f))</code> on the calling
thread to create <code class="computeroutput">cf</code> that will be invoked at most once by
an execution agent.
</li>
<li class="listitem">
May block pending completion of this invocation. Synchronizes with [intro.multithread]
the invocation of <code class="computeroutput">f</code>.
</li>
<li class="listitem">
Shall not propagate any exception thrown by the function object or any
other function submitted to the executor.
</li>
</ul></div>
<p>
[<span class="emphasis"><em>Note:</em></span> The treatment of exceptions thrown by one-way
submitted functions is implementation-defined. The forward progress guarantee
of the associated execution agent(s) is implementation-defined. —<span class="emphasis"><em>end
note</em></span>]
</p>
<h5>
<a name="asio.reference.Executor1.h1"></a>
<span><a name="asio.reference.Executor1.networking_ts_style_executors"></a></span><a class="link" href="Executor1.html#asio.reference.Executor1.networking_ts_style_executors">Networking
TS-style executors</a>
</h5>
<p>
The library describes a standard set of requirements for <span class="emphasis"><em>executors</em></span>.
A type meeting the <code class="computeroutput">Executor</code> requirements embodies a set of rules
for determining how submitted function objects are to be executed.
</p>
<p>
A type <code class="computeroutput">X</code> meets the <code class="computeroutput">Executor</code> requirements if it
satisfies the requirements of <code class="computeroutput">CopyConstructible</code> (C++Std [copyconstructible])
and <code class="computeroutput">Destructible</code> (C++Std [destructible]), as well as the additional
requirements listed below.
</p>
<p>
No constructor, comparison operator, copy operation, move operation, swap
operation, or member functions <code class="computeroutput">context</code>, <code class="computeroutput">on_work_started</code>,
and <code class="computeroutput">on_work_finished</code> on these types shall exit via an exception.
</p>
<p>
The executor copy constructor, comparison operators, and other member functions
defined in these requirements shall not introduce data races as a result
of concurrent calls to those functions from different threads.
</p>
<p>
Let <code class="computeroutput">ctx</code> be the execution context returned by the executor's
<code class="computeroutput">context()</code> member function. An executor becomes <span class="emphasis"><em>invalid</em></span>
when the first call to <code class="computeroutput">ctx.shutdown()</code> returns. The effect of
calling <code class="computeroutput">on_work_started</code>, <code class="computeroutput">on_work_finished</code>, <code class="computeroutput">dispatch</code>,
<code class="computeroutput">post</code>, or <code class="computeroutput">defer</code> on an invalid executor is undefined.
[<span class="emphasis"><em>Note:</em></span> The copy constructor, comparison operators, and
<code class="computeroutput">context()</code> member function continue to remain valid until <code class="computeroutput">ctx</code>
is destroyed. —<span class="emphasis"><em>end note</em></span>]
</p>
<p>
In the table below, <code class="computeroutput">x1</code> and <code class="computeroutput">x2</code> denote (possibly
const) values of type <code class="computeroutput">X</code>, <code class="computeroutput">mx1</code> denotes an xvalue
of type <code class="computeroutput">X</code>, <code class="computeroutput">f</code> denotes a <code class="computeroutput">MoveConstructible</code>
(C++Std [moveconstructible]) function object callable with zero arguments,
<code class="computeroutput">a</code> denotes a (possibly const) value of type <code class="computeroutput">A</code> meeting
the <code class="computeroutput">Allocator</code> requirements (C++Std [allocator.requirements]),
and <code class="computeroutput">u</code> denotes an identifier.
</p>
<div class="table">
<a name="asio.reference.Executor1.t0"></a><p class="title"><b>Table 15. Executor requirements</b></p>
<div class="table-contents"><table class="table" summary="Executor requirements">
<colgroup>
<col>
<col>
<col>
</colgroup>
<thead><tr>
<th>
<p>
expression
</p>
</th>
<th>
<p>
type
</p>
</th>
<th>
<p>
assertion/note<br> pre/post-conditions
</p>
</th>
</tr></thead>
<tbody>
<tr>
<td>
<p>
<code class="computeroutput">X u(x1);</code>
</p>
</td>
<td>
</td>
<td>
<p>
Shall not exit via an exception.<br> <br> post: <code class="computeroutput">u ==
x1</code> and <code class="computeroutput">std::addressof(u.context()) == std::addressof(x1.context()).</code>
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">X u(mx1);</code>
</p>
</td>
<td>
</td>
<td>
<p>
Shall not exit via an exception.<br> <br> post: <code class="computeroutput">u</code>
equals the prior value of <code class="computeroutput">mx1</code> and <code class="computeroutput">std::addressof(u.context())</code>
equals the prior value of <code class="computeroutput">std::addressof(mx1.context())</code>.
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">x1 == x2</code>
</p>
</td>
<td>
<p>
<code class="computeroutput">bool</code>
</p>
</td>
<td>
<p>
Returns <code class="computeroutput">true</code> only if <code class="computeroutput">x1</code> and <code class="computeroutput">x2</code>
can be interchanged with identical effects in any of the expressions
defined in these type requirements. [<span class="emphasis"><em>Note:</em></span>
Returning <code class="computeroutput">false</code> does not necessarily imply that the
effects are not identical. —<span class="emphasis"><em>end note</em></span>] <br>
<br> <code class="computeroutput">operator==</code> shall be reflexive, symmetric, and
transitive, and shall not exit via an exception.
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">x1 != x2</code>
</p>
</td>
<td>
<p>
<code class="computeroutput">bool</code>
</p>
</td>
<td>
<p>
Same as <code class="computeroutput">!(x1 == x2)</code>.
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">x1.context()</code>
</p>
</td>
<td>
<p>
<code class="computeroutput">execution_context&amp;</code>, or <code class="computeroutput">E&amp;</code> where
<code class="computeroutput">E</code> is a type that satifisfies the <a class="link" href="ExecutionContext.html" title="Execution context requirements"><code class="computeroutput">ExecutionContext</code></a>
requirements.
</p>
</td>
<td>
<p>
Shall not exit via an exception.<br> <br> The comparison operators
and member functions defined in these requirements shall not alter
the reference returned by this function.
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">x1.on_work_started()</code>
</p>
</td>
<td>
</td>
<td>
<p>
Shall not exit via an exception.
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">x1.on_work_finished()</code>
</p>
</td>
<td>
</td>
<td>
<p>
Shall not exit via an exception.<br> <br> Precondition: A preceding
call <code class="computeroutput">x2.on_work_started()</code> where <code class="computeroutput">x1 == x2</code>.
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">x1.dispatch(std::move(f),a)</code>
</p>
</td>
<td>
</td>
<td>
<p>
Effects: Creates an object <code class="computeroutput">f1</code> initialized with <code class="literal"><span class="emphasis"><em>DECAY_COPY</em></span></code><code class="computeroutput">(forward&lt;Func&gt;(f))</code>
(C++Std [thread.decaycopy]) in the current thread of execution
. Calls <code class="computeroutput">f1()</code> at most once. The executor may block
forward progress of the caller until <code class="computeroutput">f1()</code> finishes
execution.<br> <br> Executor implementations should use the
supplied allocator to allocate any memory required to store the
function object. Prior to invoking the function object, the executor
shall deallocate any memory allocated. [<span class="emphasis"><em>Note:</em></span>
Executors defined in this Technical Specification always use the
supplied allocator unless otherwise specified. —<span class="emphasis"><em>end note</em></span>]
<br> <br> Synchronization: The invocation of <code class="computeroutput">dispatch</code>
synchronizes with (C++Std [intro.multithread]) the invocation of
<code class="computeroutput">f1</code>.
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">x1.post(std::move(f),a)</code><br> <code class="computeroutput">x1.defer(std::move(f),a)</code>
</p>
</td>
<td>
</td>
<td>
<p>
Effects: Creates an object <code class="computeroutput">f1</code> initialized with <code class="literal"><span class="emphasis"><em>DECAY_COPY</em></span></code><code class="computeroutput">(forward&lt;Func&gt;(f))</code>
in the current thread of execution. Calls <code class="computeroutput">f1()</code> at
most once. The executor shall not block forward progress of the
caller pending completion of <code class="computeroutput">f1()</code>.<br> <br> Executor
implementations should use the supplied allocator to allocate any
memory required to store the function object. Prior to invoking
the function object, the executor shall deallocate any memory allocated.
[<span class="emphasis"><em>Note:</em></span> Executors defined in this Technical
Specification always use the supplied allocator unless otherwise
specified. —<span class="emphasis"><em>end note</em></span>] <br> <br> Synchronization:
The invocation of <code class="computeroutput">post</code> or <code class="computeroutput">defer</code> synchronizes
with (C++Std [intro.multithread]) the invocation of <code class="computeroutput">f1</code>.<br>
<br> [<span class="emphasis"><em>Note:</em></span> Although the requirements placed
on <code class="computeroutput">defer</code> are identical to <code class="computeroutput">post</code>, the use
of <code class="computeroutput">post</code> conveys a preference that the caller <span class="emphasis"><em>does
not</em></span> block the first step of <code class="literal">f1</code>'s
progress, whereas <code class="computeroutput">defer</code> conveys a preference that
the caller <span class="emphasis"><em>does</em></span> block the first step of <code class="literal">f1</code>.
One use of <code class="computeroutput">defer</code> is to convey the intention of the
caller that <code class="literal">f1</code> is a continuation of the current
call context. The executor may use this information to optimize
or otherwise adjust the way in which <code class="computeroutput">f1</code> is invoked.
<span class="emphasis"><em>end note</em></span>]
</p>
</td>
</tr>
</tbody>
</table></div>
</div>
<br class="table-break">
</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-2020 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="ExecutionContext.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="GettableSerialPortOption.html"><img src="../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,95 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Gettable serial port option requirements</title>
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../index.html" title="Asio">
<link rel="up" href="../reference.html" title="Reference">
<link rel="prev" href="Executor1.html" title="Executor requirements">
<link rel="next" href="GettableSocketOption.html" title="Gettable socket option requirements">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="Executor1.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="GettableSocketOption.html"><img src="../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="asio.reference.GettableSerialPortOption"></a><a class="link" href="GettableSerialPortOption.html" title="Gettable serial port option requirements">Gettable serial
port option requirements</a>
</h3></div></div></div>
<p>
In the table below, <code class="computeroutput">X</code> denotes a serial port option class, <code class="computeroutput">a</code>
denotes a value of <code class="computeroutput">X</code>, <code class="computeroutput">ec</code> denotes a value of type
<code class="computeroutput">error_code</code>, and <code class="computeroutput">s</code> denotes a value of implementation-defined
type <span class="emphasis"><em><code class="literal">storage</code></em></span> (where <span class="emphasis"><em><code class="literal">storage</code></em></span>
is the type <code class="computeroutput">DCB</code> on Windows and <code class="computeroutput">termios</code> on <span class="emphasis"><em>POSIX</em></span>
platforms), and <code class="computeroutput">u</code> denotes an identifier.
</p>
<div class="table">
<a name="asio.reference.GettableSerialPortOption.t0"></a><p class="title"><b>Table 16. GettableSerialPortOption requirements</b></p>
<div class="table-contents"><table class="table" summary="GettableSerialPortOption requirements">
<colgroup>
<col>
<col>
<col>
</colgroup>
<thead><tr>
<th>
<p>
expression
</p>
</th>
<th>
<p>
type
</p>
</th>
<th>
<p>
assertion/note<br> pre/post-conditions
</p>
</th>
</tr></thead>
<tbody><tr>
<td>
<p>
<code class="computeroutput">const </code><span class="emphasis"><em><code class="literal">storage</code></em></span><code class="computeroutput">&amp;
u = s;</code><br> <code class="computeroutput">a.load(u, ec);</code>
</p>
</td>
<td>
<p>
<code class="computeroutput">error_code</code>
</p>
</td>
<td>
<p>
Retrieves the value of the serial port option from the storage.<br>
<br> If successful, sets <code class="computeroutput">ec</code> such that <code class="computeroutput">!ec</code>
is true. If an error occurred, sets <code class="computeroutput">ec</code> such that
<code class="computeroutput">!!ec</code> is true. Returns <code class="computeroutput">ec</code>.
</p>
</td>
</tr></tbody>
</table></div>
</div>
<br class="table-break">
</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-2020 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="Executor1.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="GettableSocketOption.html"><img src="../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,175 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Gettable socket option requirements</title>
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../index.html" title="Asio">
<link rel="up" href="../reference.html" title="Reference">
<link rel="prev" href="GettableSerialPortOption.html" title="Gettable serial port option requirements">
<link rel="next" href="Handler.html" title="Handlers">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="GettableSerialPortOption.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="Handler.html"><img src="../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="asio.reference.GettableSocketOption"></a><a class="link" href="GettableSocketOption.html" title="Gettable socket option requirements">Gettable socket
option requirements</a>
</h3></div></div></div>
<p>
A type <code class="computeroutput">X</code> meets the <code class="computeroutput">GettableSocketOption</code> requirements
if it satisfies the requirements listed below.
</p>
<p>
In the table below, <code class="computeroutput">a</code> denotes a (possibly const) value of type
<code class="computeroutput">X</code>, <code class="computeroutput">b</code> denotes a value of type <code class="computeroutput">X</code>, <code class="computeroutput">p</code>
denotes a (possibly const) value that meets the <a class="link" href="Protocol.html" title="Protocol requirements"><code class="computeroutput">Protocol</code></a>
requirements, and <code class="computeroutput">s</code> denotes a (possibly const) value of a type
that is convertible to <code class="computeroutput">size_t</code> and denotes a size in bytes.
</p>
<div class="table">
<a name="asio.reference.GettableSocketOption.t0"></a><p class="title"><b>Table 17. GettableSocketOption requirements for extensible implementations</b></p>
<div class="table-contents"><table class="table" summary="GettableSocketOption requirements for extensible implementations">
<colgroup>
<col>
<col>
<col>
</colgroup>
<thead><tr>
<th>
<p>
expression
</p>
</th>
<th>
<p>
type
</p>
</th>
<th>
<p>
assertion/note<br> pre/post-conditions
</p>
</th>
</tr></thead>
<tbody>
<tr>
<td>
<p>
<code class="computeroutput">a.level(p)</code>
</p>
</td>
<td>
<p>
<code class="computeroutput">int</code>
</p>
</td>
<td>
<p>
Returns a value suitable for passing as the <span class="emphasis"><em>level</em></span>
argument to <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html" target="_top"><code class="computeroutput"><span class="identifier">getsockopt</span><span class="special">()</span></code></a>
(or equivalent).
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">a.name(p)</code>
</p>
</td>
<td>
<p>
<code class="computeroutput">int</code>
</p>
</td>
<td>
<p>
Returns a value suitable for passing as the <span class="emphasis"><em>option_name</em></span>
argument to <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html" target="_top"><code class="computeroutput"><span class="identifier">getsockopt</span><span class="special">()</span></code></a>
(or equivalent).
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">b.data(p)</code>
</p>
</td>
<td>
<p>
<code class="computeroutput">void*</code>
</p>
</td>
<td>
<p>
Returns a pointer suitable for passing as the <span class="emphasis"><em>option_value</em></span>
argument to <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html" target="_top"><code class="computeroutput"><span class="identifier">getsockopt</span><span class="special">()</span></code></a>
(or equivalent).
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">a.size(p)</code>
</p>
</td>
<td>
<p>
<code class="computeroutput">size_t</code>
</p>
</td>
<td>
<p>
Returns a value suitable for passing as the <span class="emphasis"><em>option_len</em></span>
argument to <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html" target="_top"><code class="computeroutput"><span class="identifier">getsockopt</span><span class="special">()</span></code></a>
(or equivalent), after appropriate integer conversion has been
performed.
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">b.resize(p,s)</code>
</p>
</td>
<td>
</td>
<td>
<p>
post: <code class="computeroutput">b.size(p) == s</code>.<br> Passed the value contained
in the <span class="emphasis"><em>option_len</em></span> argument to <span class="emphasis"><em>POSIX</em></span>
<a href="http://www.opengroup.org/onlinepubs/9699919799/functions/getsockopt.html" target="_top"><code class="computeroutput"><span class="identifier">getsockopt</span><span class="special">()</span></code></a>
(or equivalent) after successful completion of the function. Permitted
to throw an exception if the socket option object <code class="computeroutput">b</code>
does not support the specified size.
</p>
</td>
</tr>
</tbody>
</table></div>
</div>
<br class="table-break">
</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-2020 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="GettableSerialPortOption.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="Handler.html"><img src="../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,150 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Handlers</title>
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../index.html" title="Asio">
<link rel="up" href="../reference.html" title="Reference">
<link rel="prev" href="GettableSocketOption.html" title="Gettable socket option requirements">
<link rel="next" href="HandshakeHandler.html" title="SSL handshake handler requirements">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="GettableSocketOption.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="HandshakeHandler.html"><img src="../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="asio.reference.Handler"></a><a class="link" href="Handler.html" title="Handlers">Handlers</a>
</h3></div></div></div>
<p>
A handler must meet the requirements of <code class="computeroutput">MoveConstructible</code> types
(C++Std [moveconstructible]).
</p>
<p>
In the table below, <code class="computeroutput">X</code> denotes a handler class, <code class="computeroutput">h</code>
denotes a value of <code class="computeroutput">X</code>, <code class="computeroutput">p</code> denotes a pointer to a
block of allocated memory of type <code class="computeroutput">void*</code>, <code class="computeroutput">s</code> denotes
the size for a block of allocated memory, and <code class="computeroutput">f</code> denotes a function
object taking no arguments.
</p>
<div class="table">
<a name="asio.reference.Handler.t0"></a><p class="title"><b>Table 18. Handler requirements</b></p>
<div class="table-contents"><table class="table" summary="Handler requirements">
<colgroup>
<col>
<col>
<col>
</colgroup>
<thead><tr>
<th>
<p>
expression
</p>
</th>
<th>
<p>
return type
</p>
</th>
<th>
<p>
assertion/note<br> pre/post-conditions
</p>
</th>
</tr></thead>
<tbody>
<tr>
<td>
<p>
</p>
<pre class="programlisting">using asio::asio_handler_allocate;
asio_handler_allocate(s, &amp;h);
</pre>
<p>
</p>
</td>
<td>
<p>
<code class="computeroutput">void*</code>
</p>
</td>
<td>
<p>
Returns a pointer to a block of memory of size <code class="computeroutput">s</code>.
The pointer must satisfy the same alignment requirements as a pointer
returned by <code class="computeroutput">::operator new()</code>. Throws <code class="computeroutput">bad_alloc</code>
on failure.<br> <br> The <code class="computeroutput">asio_handler_allocate()</code>
function is located using argument-dependent lookup. The function
<code class="computeroutput">asio::asio_handler_allocate()</code> serves as a default
if no user-supplied function is available.
</p>
</td>
</tr>
<tr>
<td>
<p>
</p>
<pre class="programlisting">using asio::asio_handler_deallocate;
asio_handler_deallocate(p, s, &amp;h);
</pre>
<p>
</p>
</td>
<td>
</td>
<td>
<p>
Frees a block of memory associated with a pointer <code class="computeroutput">p</code>,
of at least size <code class="computeroutput">s</code>, that was previously allocated
using <code class="computeroutput">asio_handler_allocate()</code>.<br> <br> The <code class="computeroutput">asio_handler_deallocate()</code>
function is located using argument-dependent lookup. The function
<code class="computeroutput">asio::asio_handler_deallocate()</code> serves as a default
if no user-supplied function is available.
</p>
</td>
</tr>
<tr>
<td>
<p>
</p>
<pre class="programlisting">using asio::asio_handler_invoke;
asio_handler_invoke(f, &amp;h);
</pre>
<p>
</p>
</td>
<td>
</td>
<td>
<p>
Causes the function object <code class="computeroutput">f</code> to be executed as if
by calling <code class="computeroutput">f()</code>.<br> <br> The <code class="computeroutput">asio_handler_invoke()</code>
function is located using argument-dependent lookup. The function
<code class="computeroutput">asio::asio_handler_invoke()</code> serves as a default if
no user-supplied function is available.
</p>
</td>
</tr>
</tbody>
</table></div>
</div>
<br class="table-break">
</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-2020 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="GettableSocketOption.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="HandshakeHandler.html"><img src="../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,108 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>SSL handshake handler requirements</title>
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../index.html" title="Asio">
<link rel="up" href="../reference.html" title="Reference">
<link rel="prev" href="Handler.html" title="Handlers">
<link rel="next" href="InternetProtocol.html" title="Internet protocol requirements">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="Handler.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="InternetProtocol.html"><img src="../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="asio.reference.HandshakeHandler"></a><a class="link" href="HandshakeHandler.html" title="SSL handshake handler requirements">SSL handshake handler
requirements</a>
</h3></div></div></div>
<p>
A handshake handler must meet the requirements for a <a class="link" href="Handler.html" title="Handlers">handler</a>.
A value <code class="computeroutput">h</code> of a handshake handler class should work correctly
in the expression <code class="computeroutput">h(ec)</code>, where <code class="computeroutput">ec</code> is an lvalue
of type <code class="computeroutput">const error_code</code>.
</p>
<h5>
<a name="asio.reference.HandshakeHandler.h0"></a>
<span><a name="asio.reference.HandshakeHandler.examples"></a></span><a class="link" href="HandshakeHandler.html#asio.reference.HandshakeHandler.examples">Examples</a>
</h5>
<p>
A free function as a handshake handler:
</p>
<pre class="programlisting">void handshake_handler(
const asio::error_code&amp; ec)
{
...
}
</pre>
<p>
A handshake handler function object:
</p>
<pre class="programlisting">struct handshake_handler
{
...
void operator()(
const asio::error_code&amp; ec)
{
...
}
...
};
</pre>
<p>
A lambda as a handshake handler:
</p>
<pre class="programlisting">ssl_stream.async_handshake(...,
[](const asio::error_code&amp; ec)
{
...
});
</pre>
<p>
A non-static class member function adapted to a handshake handler using
<code class="computeroutput">std::bind()</code>:
</p>
<pre class="programlisting">void my_class::handshake_handler(
const asio::error_code&amp; ec)
{
...
}
...
ssl_stream.async_handshake(...,
std::bind(&amp;my_class::handshake_handler,
this, std::placeholders::_1));
</pre>
<p>
A non-static class member function adapted to a handshake handler using
<code class="computeroutput">boost::bind()</code>:
</p>
<pre class="programlisting">void my_class::handshake_handler(
const asio::error_code&amp; ec)
{
...
}
...
ssl_stream.async_handshake(...,
boost::bind(&amp;my_class::handshake_handler,
this, asio::placeholders::error));
</pre>
</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-2020 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="Handler.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="InternetProtocol.html"><img src="../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,163 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Internet protocol requirements</title>
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../index.html" title="Asio">
<link rel="up" href="../reference.html" title="Reference">
<link rel="prev" href="HandshakeHandler.html" title="SSL handshake handler requirements">
<link rel="next" href="IoControlCommand.html" title="I/O control command requirements">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="HandshakeHandler.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="IoControlCommand.html"><img src="../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="asio.reference.InternetProtocol"></a><a class="link" href="InternetProtocol.html" title="Internet protocol requirements">Internet protocol requirements</a>
</h3></div></div></div>
<p>
A type <code class="computeroutput">X</code> meets the <code class="computeroutput">InternetProtocol</code> requirements
if it satisfies the requirements of <a class="link" href="AcceptableProtocol.html" title="Acceptable protocol requirements"><code class="computeroutput">AcceptableProtocol</code></a>,
as well as the additional requirements listed below.
</p>
<p>
In the table below, <code class="computeroutput">a</code> denotes a (possibly const) value of type
<code class="computeroutput">X</code>, and <code class="computeroutput">b</code> denotes a (possibly const) value of type
<code class="computeroutput">X</code>.
</p>
<div class="table">
<a name="asio.reference.InternetProtocol.t0"></a><p class="title"><b>Table 19. InternetProtocol requirements</b></p>
<div class="table-contents"><table class="table" summary="InternetProtocol requirements">
<colgroup>
<col>
<col>
<col>
</colgroup>
<thead><tr>
<th>
<p>
expression
</p>
</th>
<th>
<p>
return type
</p>
</th>
<th>
<p>
assertion/note<br> pre/post-conditions
</p>
</th>
</tr></thead>
<tbody>
<tr>
<td>
<p>
<code class="computeroutput">X::resolver</code>
</p>
</td>
<td>
<p>
<code class="computeroutput">ip::basic_resolver&lt;X&gt;</code>
</p>
</td>
<td>
<p>
The type of a resolver for the protocol.
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">X::v4()</code>
</p>
</td>
<td>
<p>
<code class="computeroutput">X</code>
</p>
</td>
<td>
<p>
Returns an object representing the IP version 4 protocol.
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">X::v6()</code>
</p>
</td>
<td>
<p>
<code class="computeroutput">X</code>
</p>
</td>
<td>
<p>
Returns an object representing the IP version 6 protocol.
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">a == b</code>
</p>
</td>
<td>
<p>
convertible to <code class="computeroutput">bool</code>
</p>
</td>
<td>
<p>
Returns <code class="computeroutput">true</code> if <code class="computeroutput">a</code> and <code class="computeroutput">b</code>
represent the same IP protocol version, otherwise <code class="computeroutput">false</code>.
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">a != b</code>
</p>
</td>
<td>
<p>
convertible to <code class="computeroutput">bool</code>
</p>
</td>
<td>
<p>
Returns <code class="computeroutput">!(a == b)</code>.
</p>
</td>
</tr>
</tbody>
</table></div>
</div>
<br class="table-break">
</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-2020 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="HandshakeHandler.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="IoControlCommand.html"><img src="../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,109 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>I/O control command requirements</title>
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../index.html" title="Asio">
<link rel="up" href="../reference.html" title="Reference">
<link rel="prev" href="InternetProtocol.html" title="Internet protocol requirements">
<link rel="next" href="IoObjectService.html" title="I/O object service requirements">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="InternetProtocol.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="IoObjectService.html"><img src="../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="asio.reference.IoControlCommand"></a><a class="link" href="IoControlCommand.html" title="I/O control command requirements">I/O control command
requirements</a>
</h3></div></div></div>
<p>
A type <code class="computeroutput">X</code> meets the <code class="computeroutput">IoControlCommand</code> requirements
if it satisfies the requirements listed below.
</p>
<p>
In the table below, <code class="computeroutput">a</code> denotes a (possibly const) value of type
<code class="computeroutput">X</code>, and <code class="computeroutput">b</code> denotes a value of type <code class="computeroutput">X</code>.
</p>
<div class="table">
<a name="asio.reference.IoControlCommand.t0"></a><p class="title"><b>Table 20. IoControlCommand requirements for extensible implementations</b></p>
<div class="table-contents"><table class="table" summary="IoControlCommand requirements for extensible implementations">
<colgroup>
<col>
<col>
<col>
</colgroup>
<thead><tr>
<th>
<p>
expression
</p>
</th>
<th>
<p>
type
</p>
</th>
<th>
<p>
assertion/note<br> pre/post-conditions
</p>
</th>
</tr></thead>
<tbody>
<tr>
<td>
<p>
<code class="computeroutput">a.name()</code>
</p>
</td>
<td>
<p>
<code class="computeroutput">int</code>
</p>
</td>
<td>
<p>
Returns a value suitable for passing as the <span class="emphasis"><em>request</em></span>
argument to <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/ioctl.html" target="_top"><code class="computeroutput"><span class="identifier">ioctl</span><span class="special">()</span></code></a>
(or equivalent).
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">b.data()</code>
</p>
</td>
<td>
<p>
<code class="computeroutput">void*</code>
</p>
</td>
<td>
</td>
</tr>
</tbody>
</table></div>
</div>
<br class="table-break">
</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-2020 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="InternetProtocol.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="IoObjectService.html"><img src="../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,170 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>I/O object service requirements</title>
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../index.html" title="Asio">
<link rel="up" href="../reference.html" title="Reference">
<link rel="prev" href="IoControlCommand.html" title="I/O control command requirements">
<link rel="next" href="IteratorConnectHandler.html" title="Iterator connect handler requirements">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="IoControlCommand.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="IteratorConnectHandler.html"><img src="../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="asio.reference.IoObjectService"></a><a class="link" href="IoObjectService.html" title="I/O object service requirements">I/O object service requirements</a>
</h3></div></div></div>
<p>
An I/O object service must meet the requirements for a <a class="link" href="Service.html" title="Service requirements">service</a>,
as well as the requirements listed below.
</p>
<p>
In the table below, <code class="computeroutput">X</code> denotes an I/O object service class,
<code class="computeroutput">a</code> and <code class="computeroutput">ao</code> denote values of type <code class="computeroutput">X</code>,
<code class="computeroutput">b</code> and <code class="computeroutput">c</code> denote values of type <code class="computeroutput">X::implementation_type</code>,
and <code class="computeroutput">u</code> denotes an identifier.
</p>
<div class="table">
<a name="asio.reference.IoObjectService.t0"></a><p class="title"><b>Table 21. IoObjectService requirements</b></p>
<div class="table-contents"><table class="table" summary="IoObjectService requirements">
<colgroup>
<col>
<col>
<col>
</colgroup>
<thead><tr>
<th>
<p>
expression
</p>
</th>
<th>
<p>
return type
</p>
</th>
<th>
<p>
assertion/note<br> pre/post-condition
</p>
</th>
</tr></thead>
<tbody>
<tr>
<td>
<p>
<code class="computeroutput">X::implementation_type</code>
</p>
</td>
<td>
</td>
<td>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">X::implementation_type u;</code>
</p>
</td>
<td>
</td>
<td>
<p>
note: <code class="computeroutput">X::implementation_type</code> has a public default
constructor and destructor.
</p>
</td>
</tr>
<tr>
<td>
<p>
</p>
<pre class="programlisting">a.construct(b);
</pre>
<p>
</p>
</td>
<td>
</td>
<td>
</td>
</tr>
<tr>
<td>
<p>
</p>
<pre class="programlisting">a.destroy(b);
</pre>
<p>
</p>
</td>
<td>
</td>
<td>
<p>
note: <code class="computeroutput">destroy()</code> will only be called on a value that
has previously been initialised with <code class="computeroutput">construct()</code> or
<code class="computeroutput">move_construct()</code>.
</p>
</td>
</tr>
<tr>
<td>
<p>
</p>
<pre class="programlisting">a.move_construct(b, c);
</pre>
<p>
</p>
</td>
<td>
</td>
<td>
<p>
note: only required for I/O objects that support movability.
</p>
</td>
</tr>
<tr>
<td>
<p>
</p>
<pre class="programlisting">a.move_assign(b, ao, c);
</pre>
<p>
</p>
</td>
<td>
</td>
<td>
<p>
note: only required for I/O objects that support movability.
</p>
</td>
</tr>
</tbody>
</table></div>
</div>
<br class="table-break">
</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-2020 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="IoControlCommand.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="IteratorConnectHandler.html"><img src="../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,118 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Iterator connect handler requirements</title>
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../index.html" title="Asio">
<link rel="up" href="../reference.html" title="Reference">
<link rel="prev" href="IoObjectService.html" title="I/O object service requirements">
<link rel="next" href="LegacyCompletionHandler.html" title="Legacy completion handler requirements">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="IoObjectService.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="LegacyCompletionHandler.html"><img src="../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="asio.reference.IteratorConnectHandler"></a><a class="link" href="IteratorConnectHandler.html" title="Iterator connect handler requirements">Iterator connect
handler requirements</a>
</h3></div></div></div>
<p>
An iterator connect handler must meet the requirements for a <a class="link" href="Handler.html" title="Handlers">handler</a>.
A value <code class="computeroutput">h</code> of an iterator connect handler class should work correctly
in the expression <code class="computeroutput">h(ec, i)</code>, where <code class="computeroutput">ec</code> is an lvalue
of type <code class="computeroutput">const error_code</code> and <code class="computeroutput">i</code> is an lvalue of
the type <code class="computeroutput">Iterator</code> used in the corresponding <code class="computeroutput">connect()</code>
or async_connect()` function.
</p>
<h5>
<a name="asio.reference.IteratorConnectHandler.h0"></a>
<span><a name="asio.reference.IteratorConnectHandler.examples"></a></span><a class="link" href="IteratorConnectHandler.html#asio.reference.IteratorConnectHandler.examples">Examples</a>
</h5>
<p>
A free function as an iterator connect handler:
</p>
<pre class="programlisting">void connect_handler(
const asio::error_code&amp; ec,
asio::ip::tcp::resolver::iterator iterator)
{
...
}
</pre>
<p>
An iterator connect handler function object:
</p>
<pre class="programlisting">struct connect_handler
{
...
template &lt;typename Iterator&gt;
void operator()(
const asio::error_code&amp; ec,
Iterator iterator)
{
...
}
...
};
</pre>
<p>
A lambda as an iterator connect handler:
</p>
<pre class="programlisting">asio::async_connect(...,
[](const asio::error_code&amp; ec,
asio::ip::tcp::resolver::iterator iterator)
{
...
});
</pre>
<p>
A non-static class member function adapted to an iterator connect handler
using <code class="computeroutput">std::bind()</code>:
</p>
<pre class="programlisting">void my_class::connect_handler(
const asio::error_code&amp; ec,
asio::ip::tcp::resolver::iterator iterator)
{
...
}
...
asio::async_connect(...,
std::bind(&amp;my_class::connect_handler,
this, std::placeholders::_1,
std::placeholders::_2));
</pre>
<p>
A non-static class member function adapted to an iterator connect handler
using <code class="computeroutput">boost::bind()</code>:
</p>
<pre class="programlisting">void my_class::connect_handler(
const asio::error_code&amp; ec,
asio::ip::tcp::resolver::iterator iterator)
{
...
}
...
asio::async_connect(...,
boost::bind(&amp;my_class::connect_handler,
this, asio::placeholders::error,
asio::placeholders::iterator));
</pre>
</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-2020 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="IoObjectService.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="LegacyCompletionHandler.html"><img src="../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,100 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Legacy completion handler requirements</title>
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../index.html" title="Asio">
<link rel="up" href="../reference.html" title="Reference">
<link rel="prev" href="IteratorConnectHandler.html" title="Iterator connect handler requirements">
<link rel="next" href="MoveAcceptHandler.html" title="Move accept handler requirements">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="IteratorConnectHandler.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="MoveAcceptHandler.html"><img src="../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="asio.reference.LegacyCompletionHandler"></a><a class="link" href="LegacyCompletionHandler.html" title="Legacy completion handler requirements">Legacy completion
handler requirements</a>
</h3></div></div></div>
<p>
A legacy completion handler must meet the requirements for a <a class="link" href="Handler.html" title="Handlers">handler</a>.
A legacy completion handler must meet the requirements of <code class="computeroutput">CopyConstructible</code>
types (C++Std [copyconstructible]). A value <code class="computeroutput">h</code> of a completion
handler class should work correctly in the expression <code class="computeroutput">h()</code>.
</p>
<h5>
<a name="asio.reference.LegacyCompletionHandler.h0"></a>
<span><a name="asio.reference.LegacyCompletionHandler.examples"></a></span><a class="link" href="LegacyCompletionHandler.html#asio.reference.LegacyCompletionHandler.examples">Examples</a>
</h5>
<p>
A free function as a completion handler:
</p>
<pre class="programlisting">void completion_handler()
{
...
}
</pre>
<p>
A completion handler function object:
</p>
<pre class="programlisting">struct completion_handler
{
...
void operator()()
{
...
}
...
};
</pre>
<p>
A lambda as a completion handler:
</p>
<pre class="programlisting">my_io_service.post(
[]()
{
...
});
</pre>
<p>
A non-static class member function adapted to a completion handler using
<code class="computeroutput">std::bind()</code>:
</p>
<pre class="programlisting">void my_class::completion_handler()
{
...
}
...
my_io_service.post(std::bind(&amp;my_class::completion_handler, this));
</pre>
<p>
A non-static class member function adapted to a completion handler using
<code class="computeroutput">boost::bind()</code>:
</p>
<pre class="programlisting">void my_class::completion_handler()
{
...
}
...
my_io_service.post(boost::bind(&amp;my_class::completion_handler, this));
</pre>
</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-2020 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="IteratorConnectHandler.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="MoveAcceptHandler.html"><img src="../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,97 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Move accept handler requirements</title>
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../index.html" title="Asio">
<link rel="up" href="../reference.html" title="Reference">
<link rel="prev" href="LegacyCompletionHandler.html" title="Legacy completion handler requirements">
<link rel="next" href="MutableBufferSequence.html" title="Mutable buffer sequence requirements">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="LegacyCompletionHandler.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="MutableBufferSequence.html"><img src="../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="asio.reference.MoveAcceptHandler"></a><a class="link" href="MoveAcceptHandler.html" title="Move accept handler requirements">Move accept handler
requirements</a>
</h3></div></div></div>
<p>
A move accept handler must meet the requirements for a <a class="link" href="Handler.html" title="Handlers">handler</a>.
A value <code class="computeroutput">h</code> of a move accept handler class should work correctly
in the expression <code class="computeroutput">h(ec, s)</code>, where <code class="computeroutput">ec</code> is an lvalue
of type <code class="computeroutput">const error_code</code> and <code class="computeroutput">s</code> is an lvalue of
the nested type <code class="computeroutput">Protocol::socket</code> for the type <code class="computeroutput">Protocol</code>
of the socket class template.
</p>
<h5>
<a name="asio.reference.MoveAcceptHandler.h0"></a>
<span><a name="asio.reference.MoveAcceptHandler.examples"></a></span><a class="link" href="MoveAcceptHandler.html#asio.reference.MoveAcceptHandler.examples">Examples</a>
</h5>
<p>
A free function as a move accept handler:
</p>
<pre class="programlisting">void accept_handler(
const asio::error_code&amp; ec, asio::ip::tcp::socket s)
{
...
}
</pre>
<p>
A move accept handler function object:
</p>
<pre class="programlisting">struct accept_handler
{
...
void operator()(
const asio::error_code&amp; ec, asio::ip::tcp::socket s)
{
...
}
...
};
</pre>
<p>
A lambda as a move accept handler:
</p>
<pre class="programlisting">acceptor.async_accept(...,
[](const asio::error_code&amp; ec, asio::ip::tcp::socket s)
{
...
});
</pre>
<p>
A non-static class member function adapted to a move accept handler using
<code class="computeroutput">std::bind()</code>:
</p>
<pre class="programlisting">void my_class::accept_handler(
const asio::error_code&amp; ec, asio::ip::tcp::socket socket)
{
...
}
...
asio::async_accept(...,
std::bind(&amp;my_class::accept_handler,
this, std::placeholders::_1,
std::placeholders::_2));
</pre>
</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-2020 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="LegacyCompletionHandler.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="MutableBufferSequence.html"><img src="../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,130 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Mutable buffer sequence requirements</title>
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../index.html" title="Asio">
<link rel="up" href="../reference.html" title="Reference">
<link rel="prev" href="MoveAcceptHandler.html" title="Move accept handler requirements">
<link rel="next" href="OperationState.html" title="Operation state concept">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="MoveAcceptHandler.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="OperationState.html"><img src="../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="asio.reference.MutableBufferSequence"></a><a class="link" href="MutableBufferSequence.html" title="Mutable buffer sequence requirements">Mutable buffer
sequence requirements</a>
</h3></div></div></div>
<p>
A <span class="emphasis"><em>mutable buffer sequence</em></span> represents a set of memory
regions that may be used to receive the output of an operation, such as the
<code class="computeroutput">receive</code> operation of a socket.
</p>
<p>
A type <code class="computeroutput">X</code> meets the <code class="computeroutput">MutableBufferSequence</code> requirements
if it satisfies the requirements of <code class="computeroutput">Destructible</code> (C++Std [destructible])
and <code class="computeroutput">CopyConstructible</code> (C++Std [copyconstructible]), as well
as the additional requirements listed below.
</p>
<p>
In the table below, <code class="computeroutput">x</code> denotes a (possibly const) value of type
<code class="computeroutput">X</code>, and <code class="computeroutput">u</code> denotes an identifier.
</p>
<div class="table">
<a name="asio.reference.MutableBufferSequence.t0"></a><p class="title"><b>Table 22. MutableBufferSequence requirements</b></p>
<div class="table-contents"><table class="table" summary="MutableBufferSequence requirements">
<colgroup>
<col>
<col>
<col>
</colgroup>
<thead><tr>
<th>
<p>
expression
</p>
</th>
<th>
<p>
return type
</p>
</th>
<th>
<p>
assertion/note<br> pre/post-condition
</p>
</th>
</tr></thead>
<tbody>
<tr>
<td>
<p>
<code class="computeroutput">asio::buffer_sequence_begin(x)</code><br> <code class="computeroutput">asio::buffer_sequence_end(x)</code>
</p>
</td>
<td>
<p>
An iterator type meeting the requirements for bidirectional iterators
(C++Std [bidirectional.iterators]) whose value type is convertible
to <code class="computeroutput">mutable_buffer</code>.
</p>
</td>
<td>
</td>
</tr>
<tr>
<td>
<p>
</p>
<pre class="programlisting">X u(x);
</pre>
<p>
</p>
</td>
<td>
</td>
<td>
<p>
post:<br>
</p>
<pre class="programlisting">equal(
asio::buffer_sequence_begin(x),
asio::buffer_sequence_end(x),
asio::buffer_sequence_begin(u),
asio::buffer_sequence_end(u),
[](const mutable_buffer&amp; b1,
const mutable_buffer&amp; b2)
{
return b1.data() == b2.data()
&amp;&amp; b1.size() == b2.size();
})
</pre>
<p>
</p>
</td>
</tr>
</tbody>
</table></div>
</div>
<br class="table-break">
</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-2020 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="MoveAcceptHandler.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="OperationState.html"><img src="../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,66 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Operation state concept</title>
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../index.html" title="Asio">
<link rel="up" href="../reference.html" title="Reference">
<link rel="prev" href="MutableBufferSequence.html" title="Mutable buffer sequence requirements">
<link rel="next" href="ProtoAllocator.html" title="Proto-allocator requirements">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="MutableBufferSequence.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="ProtoAllocator.html"><img src="../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="asio.reference.OperationState"></a><a class="link" href="OperationState.html" title="Operation state concept">Operation state concept</a>
</h3></div></div></div>
<pre class="programlisting">template&lt;class O&gt;
concept operation_state =
destructible&lt;O&gt; &amp;&amp;
is_object_v&lt;O&gt; &amp;&amp;
requires (O&amp; o) {
{ execution::start(o) } noexcept;
};
</pre>
<p>
An object whose type satisfies <code class="computeroutput">operation_state</code> represents the
state of an asynchronous operation. It is the result of calling <code class="computeroutput">execution::connect</code>
with a <code class="computeroutput">sender</code> and a <code class="computeroutput">receiver</code>.
</p>
<p>
<code class="computeroutput">execution::start</code> may be called on an <code class="computeroutput">operation_state</code>
object at most once. Once <code class="computeroutput">execution::start</code> has been invoked,
the caller shall ensure that the start of a non-exceptional invocation of
one of the receiver's completion-signalling operations strongly happens before
[intro.multithread] the call to the <code class="computeroutput">operation_state</code> destructor.
</p>
<p>
The start of the invocation of <code class="computeroutput">execution::start</code> shall strongly
happen before [intro.multithread] the invocation of one of the three receiver
operations.
</p>
<p>
<code class="computeroutput">execution::start</code> may or may not block pending the successful
transfer of execution to one of the three receiver 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-2020 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="MutableBufferSequence.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="ProtoAllocator.html"><img src="../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,48 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Proto-allocator requirements</title>
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../index.html" title="Asio">
<link rel="up" href="../reference.html" title="Reference">
<link rel="prev" href="OperationState.html" title="Operation state concept">
<link rel="next" href="Protocol.html" title="Protocol requirements">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="OperationState.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="Protocol.html"><img src="../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="asio.reference.ProtoAllocator"></a><a class="link" href="ProtoAllocator.html" title="Proto-allocator requirements">Proto-allocator requirements</a>
</h3></div></div></div>
<p>
A type <code class="computeroutput">A</code> meets the proto-allocator requirements if <code class="computeroutput">A</code>
is <code class="computeroutput">CopyConstructible</code> (C++Std [copyconstructible]), <code class="computeroutput">Destructible</code>
(C++Std [destructible]), and <code class="computeroutput">allocator_traits&lt;A&gt;::rebind_alloc&lt;U&gt;</code>
meets the allocator requirements (C++Std [allocator.requirements]), where
<code class="computeroutput">U</code> is an object type. [<span class="emphasis"><em>Note:</em></span> For example,
<code class="computeroutput">std::allocator&lt;void&gt;</code> meets the proto-allocator requirements
but not the allocator requirements. —<span class="emphasis"><em>end note</em></span>] No constructor,
comparison operator, copy operation, move operation, or swap operation on
these types shall exit via an exception.
</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-2020 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="OperationState.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="Protocol.html"><img src="../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,180 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Protocol requirements</title>
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../index.html" title="Asio">
<link rel="up" href="../reference.html" title="Reference">
<link rel="prev" href="ProtoAllocator.html" title="Proto-allocator requirements">
<link rel="next" href="RangeConnectHandler.html" title="Range connect handler requirements">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="ProtoAllocator.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="RangeConnectHandler.html"><img src="../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="asio.reference.Protocol"></a><a class="link" href="Protocol.html" title="Protocol requirements">Protocol requirements</a>
</h3></div></div></div>
<p>
A type <code class="computeroutput">X</code> meets the <code class="computeroutput">Protocol</code> requirements if it
satisfies the requirements of <code class="computeroutput">Destructible</code> (C++Std [destructible]),
<code class="computeroutput">CopyConstructible</code> (C++Std [copyconstructible]), and <code class="computeroutput">CopyAssignable</code>
(C++Std [copyassignable]), as well as the additional requirements listed
below.
</p>
<p>
No copy or move operation of the type <code class="computeroutput">X</code> shall exit via an exception.
</p>
<div class="table">
<a name="asio.reference.Protocol.t0"></a><p class="title"><b>Table 23. Protocol requirements</b></p>
<div class="table-contents"><table class="table" summary="Protocol requirements">
<colgroup>
<col>
<col>
<col>
</colgroup>
<thead><tr>
<th>
<p>
expression
</p>
</th>
<th>
<p>
return type
</p>
</th>
<th>
<p>
assertion/note<br> pre/post-conditions
</p>
</th>
</tr></thead>
<tbody><tr>
<td>
<p>
<code class="computeroutput">X::endpoint</code>
</p>
</td>
<td>
<p>
type meeting <a class="link" href="Endpoint.html" title="Endpoint requirements">endpoint</a>
requirements
</p>
</td>
<td>
</td>
</tr></tbody>
</table></div>
</div>
<br class="table-break"><p>
In the table below, <code class="computeroutput">a</code> denotes a (possibly const) value of type
<code class="computeroutput">X</code>.
</p>
<div class="table">
<a name="asio.reference.Protocol.t1"></a><p class="title"><b>Table 24. Protocol requirements for extensible implementations</b></p>
<div class="table-contents"><table class="table" summary="Protocol requirements for extensible implementations">
<colgroup>
<col>
<col>
<col>
</colgroup>
<thead><tr>
<th>
<p>
expression
</p>
</th>
<th>
<p>
return type
</p>
</th>
<th>
<p>
assertion/note<br> pre/post-conditions
</p>
</th>
</tr></thead>
<tbody>
<tr>
<td>
<p>
<code class="computeroutput">a.family()</code>
</p>
</td>
<td>
<p>
<code class="computeroutput">int</code>
</p>
</td>
<td>
<p>
Returns a value suitable for passing as the <span class="emphasis"><em>domain</em></span>
argument to <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/socket.html" target="_top"><code class="computeroutput"><span class="identifier">socket</span><span class="special">()</span></code></a>
(or equivalent).
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">a.type()</code>
</p>
</td>
<td>
<p>
<code class="computeroutput">int</code>
</p>
</td>
<td>
<p>
Returns a value suitable for passing as the <span class="emphasis"><em>type</em></span>
argument to <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/socket.html" target="_top"><code class="computeroutput"><span class="identifier">socket</span><span class="special">()</span></code></a>
(or equivalent).
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">a.protocol()</code>
</p>
</td>
<td>
<p>
<code class="computeroutput">int</code>
</p>
</td>
<td>
<p>
Returns a value suitable for passing as the <span class="emphasis"><em>protocol</em></span>
argument to <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/socket.html" target="_top"><code class="computeroutput"><span class="identifier">socket</span><span class="special">()</span></code></a>
(or equivalent).
</p>
</td>
</tr>
</tbody>
</table></div>
</div>
<br class="table-break">
</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-2020 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="ProtoAllocator.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="RangeConnectHandler.html"><img src="../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,118 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Range connect handler requirements</title>
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../index.html" title="Asio">
<link rel="up" href="../reference.html" title="Reference">
<link rel="prev" href="Protocol.html" title="Protocol requirements">
<link rel="next" href="ReadHandler.html" title="Read handler requirements">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="Protocol.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="ReadHandler.html"><img src="../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="asio.reference.RangeConnectHandler"></a><a class="link" href="RangeConnectHandler.html" title="Range connect handler requirements">Range connect handler
requirements</a>
</h3></div></div></div>
<p>
A range connect handler must meet the requirements for a <a class="link" href="Handler.html" title="Handlers">handler</a>.
A value <code class="computeroutput">h</code> of a range connect handler class should work correctly
in the expression <code class="computeroutput">h(ec, ep)</code>, where <code class="computeroutput">ec</code> is an lvalue
of type <code class="computeroutput">const error_code</code> and <code class="computeroutput">ep</code> is an lvalue of
the type <code class="computeroutput">Protocol::endpoint</code> for the <code class="computeroutput">Protocol</code> type
in the corresponding <code class="computeroutput">connect()</code> or async_connect()` function.
</p>
<h5>
<a name="asio.reference.RangeConnectHandler.h0"></a>
<span><a name="asio.reference.RangeConnectHandler.examples"></a></span><a class="link" href="RangeConnectHandler.html#asio.reference.RangeConnectHandler.examples">Examples</a>
</h5>
<p>
A free function as a range connect handler:
</p>
<pre class="programlisting">void connect_handler(
const asio::error_code&amp; ec,
const asio::ip::tcp::endpoint&amp; endpoint)
{
...
}
</pre>
<p>
A range connect handler function object:
</p>
<pre class="programlisting">struct connect_handler
{
...
template &lt;typename Range&gt;
void operator()(
const asio::error_code&amp; ec,
const asio::ip::tcp::endpoint&amp; endpoint)
{
...
}
...
};
</pre>
<p>
A lambda as a range connect handler:
</p>
<pre class="programlisting">asio::async_connect(...,
[](const asio::error_code&amp; ec,
const asio::ip::tcp::endpoint&amp; endpoint)
{
...
});
</pre>
<p>
A non-static class member function adapted to a range connect handler using
<code class="computeroutput">std::bind()</code>:
</p>
<pre class="programlisting">void my_class::connect_handler(
const asio::error_code&amp; ec,
const asio::ip::tcp::endpoint&amp; endpoint)
{
...
}
...
asio::async_connect(...,
std::bind(&amp;my_class::connect_handler,
this, std::placeholders::_1,
std::placeholders::_2));
</pre>
<p>
A non-static class member function adapted to a range connect handler using
<code class="computeroutput">boost::bind()</code>:
</p>
<pre class="programlisting">void my_class::connect_handler(
const asio::error_code&amp; ec,
const asio::ip::tcp::endpoint&amp; endpoint)
{
...
}
...
asio::async_connect(...,
boost::bind(&amp;my_class::connect_handler,
this, asio::placeholders::error,
asio::placeholders::endpoint));
</pre>
</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-2020 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="Protocol.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="ReadHandler.html"><img src="../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,113 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Read handler requirements</title>
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../index.html" title="Asio">
<link rel="up" href="../reference.html" title="Reference">
<link rel="prev" href="RangeConnectHandler.html" title="Range connect handler requirements">
<link rel="next" href="Receiver.html" title="Receiver concepts">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="RangeConnectHandler.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="Receiver.html"><img src="../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="asio.reference.ReadHandler"></a><a class="link" href="ReadHandler.html" title="Read handler requirements">Read handler requirements</a>
</h3></div></div></div>
<p>
A read handler must meet the requirements for a <a class="link" href="Handler.html" title="Handlers">handler</a>.
A value <code class="computeroutput">h</code> of a read handler class should work correctly in the
expression <code class="computeroutput">h(ec, s)</code>, where <code class="computeroutput">ec</code> is an lvalue of type
<code class="computeroutput">const error_code</code> and <code class="computeroutput">s</code> is an lvalue of type <code class="computeroutput">const
size_t</code>.
</p>
<h5>
<a name="asio.reference.ReadHandler.h0"></a>
<span><a name="asio.reference.ReadHandler.examples"></a></span><a class="link" href="ReadHandler.html#asio.reference.ReadHandler.examples">Examples</a>
</h5>
<p>
A free function as a read handler:
</p>
<pre class="programlisting">void read_handler(
const asio::error_code&amp; ec,
std::size_t bytes_transferred)
{
...
}
</pre>
<p>
A read handler function object:
</p>
<pre class="programlisting">struct read_handler
{
...
void operator()(
const asio::error_code&amp; ec,
std::size_t bytes_transferred)
{
...
}
...
};
</pre>
<p>
A lambda as a read handler:
</p>
<pre class="programlisting">socket.async_read(...
[](const asio::error_code&amp; ec,
std::size_t bytes_transferred)
{
...
});
</pre>
<p>
A non-static class member function adapted to a read handler using <code class="computeroutput">std::bind()</code>:
</p>
<pre class="programlisting">void my_class::read_handler(
const asio::error_code&amp; ec,
std::size_t bytes_transferred)
{
...
}
...
socket.async_read(...,
std::bind(&amp;my_class::read_handler,
this, std::placeholders::_1,
std::placeholders::_2));
</pre>
<p>
A non-static class member function adapted to a read handler using <code class="computeroutput">boost::bind()</code>:
</p>
<pre class="programlisting">void my_class::read_handler(
const asio::error_code&amp; ec,
std::size_t bytes_transferred)
{
...
}
...
socket.async_read(...,
boost::bind(&amp;my_class::read_handler,
this, asio::placeholders::error,
asio::placeholders::bytes_transferred));
</pre>
</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-2020 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="RangeConnectHandler.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="Receiver.html"><img src="../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,88 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Receiver concepts</title>
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../index.html" title="Asio">
<link rel="up" href="../reference.html" title="Reference">
<link rel="prev" href="ReadHandler.html" title="Read handler requirements">
<link rel="next" href="ResolveHandler.html" title="Resolve handler requirements">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="ReadHandler.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="ResolveHandler.html"><img src="../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="asio.reference.Receiver"></a><a class="link" href="Receiver.html" title="Receiver concepts">Receiver concepts</a>
</h3></div></div></div>
<p>
A receiver represents the continuation of an asynchronous operation. An asynchronous
operation may complete with a (possibly empty) set of values, an error, or
it may be cancelled. A receiver has three principal operations corresponding
to the three ways an asynchronous operation may complete: <code class="computeroutput">set_value</code>,
<code class="computeroutput">set_error</code>, and <code class="computeroutput">set_done</code>. These are collectively
known as a receivers <span class="emphasis"><em>completion-signal operations</em></span>.
</p>
<pre class="programlisting">template&lt;class T, class E = exception_ptr&gt;
concept receiver =
move_constructible&lt;remove_cvref_t&lt;T&gt;&gt; &amp;&amp;
constructible_from&lt;remove_cvref_t&lt;T&gt;, T&gt; &amp;&amp;
requires(remove_cvref_t&lt;T&gt;&amp;&amp; t, E&amp;&amp; e) {
{ execution::set_done(std::move(t)) } noexcept;
{ execution::set_error(std::move(t), (E&amp;&amp;) e) } noexcept;
};
template&lt;class T, class... An&gt;
concept receiver_of =
receiver&lt;T&gt; &amp;&amp;
requires(remove_cvref_t&lt;T&gt;&amp;&amp; t, An&amp;&amp;... an) {
execution::set_value(std::move(t), (An&amp;&amp;) an...);
};
</pre>
<p>
The receivers completion-signal operations have semantic requirements
that are collectively known as the <span class="emphasis"><em>receiver contract</em></span>,
described below:
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem">
None of a receivers completion-signal operations shall be invoked
before <code class="computeroutput">execution::start</code> has been called on the operation
state object that was returned by <code class="computeroutput">execution::connect</code> to
connect that receiver to a sender.
</li>
<li class="listitem">
Once <code class="computeroutput">execution::start</code> has been called on the operation state
object, exactly one of the receivers completion-signal operations
shall complete non-exceptionally before the receiver is destroyed.
</li>
<li class="listitem">
If <code class="computeroutput">execution::set_value</code> exits with an exception, it is still
valid to call <code class="computeroutput">execution::set_error</code> or <code class="computeroutput">execution::set_done</code>
on the receiver.
</li>
</ul></div>
<p>
Once one of a receivers completion-signal operations has completed non-exceptionally,
the receiver contract has been satisfied.
</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-2020 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="ReadHandler.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="ResolveHandler.html"><img src="../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,115 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Resolve handler requirements</title>
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../index.html" title="Asio">
<link rel="up" href="../reference.html" title="Reference">
<link rel="prev" href="Receiver.html" title="Receiver concepts">
<link rel="next" href="Scheduler.html" title="Scheduler concept">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="Receiver.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="Scheduler.html"><img src="../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="asio.reference.ResolveHandler"></a><a class="link" href="ResolveHandler.html" title="Resolve handler requirements">Resolve handler requirements</a>
</h3></div></div></div>
<p>
A resolve handler must meet the requirements for a <a class="link" href="Handler.html" title="Handlers">handler</a>.
A value <code class="computeroutput">h</code> of a resolve handler class should work correctly in
the expression <code class="computeroutput">h(ec, r)</code>, where <code class="computeroutput">ec</code> is an lvalue
of type <code class="computeroutput">const error_code</code> and <code class="computeroutput">r</code> is an lvalue of
type <code class="computeroutput">const ip::basic_resolver_results&lt;InternetProtocol&gt;</code>.
<code class="computeroutput">InternetProtocol</code> is the template parameter of the <a class="link" href="ip__basic_resolver.html" title="ip::basic_resolver"><code class="computeroutput">ip::basic_resolver&lt;&gt;</code></a>
which is used to initiate the asynchronous operation.
</p>
<h5>
<a name="asio.reference.ResolveHandler.h0"></a>
<span><a name="asio.reference.ResolveHandler.examples"></a></span><a class="link" href="ResolveHandler.html#asio.reference.ResolveHandler.examples">Examples</a>
</h5>
<p>
A free function as a resolve handler:
</p>
<pre class="programlisting">void resolve_handler(
const asio::error_code&amp; ec,
asio::ip::tcp::resolver::results_type results)
{
...
}
</pre>
<p>
A resolve handler function object:
</p>
<pre class="programlisting">struct resolve_handler
{
...
void operator()(
const asio::error_code&amp; ec,
asio::ip::tcp::resolver::results_type results)
{
...
}
...
};
</pre>
<p>
A lambda as a resolve handler:
</p>
<pre class="programlisting">resolver.async_resolve(...,
[](const asio::error_code&amp; ec,
asio::ip::tcp::resolver::results_type results)
{
...
});
</pre>
<p>
A non-static class member function adapted to a resolve handler using <code class="computeroutput">std::bind()</code>:
</p>
<pre class="programlisting">void my_class::resolve_handler(
const asio::error_code&amp; ec,
asio::ip::tcp::resolver::results_type results)
{
...
}
...
resolver.async_resolve(...,
std::bind(&amp;my_class::resolve_handler,
this, std::placeholders::_1,
std::placeholders::_2));
</pre>
<p>
A non-static class member function adapted to a resolve handler using <code class="computeroutput">boost::bind()</code>:
</p>
<pre class="programlisting">void my_class::resolve_handler(
const asio::error_code&amp; ec,
asio::ip::tcp::resolver::results_type results)
{
...
}
...
resolver.async_resolve(...,
boost::bind(&amp;my_class::resolve_handler,
this, asio::placeholders::error,
asio::placeholders::results));
</pre>
</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-2020 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="Receiver.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="Scheduler.html"><img src="../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,178 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Scheduler concept</title>
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../index.html" title="Asio">
<link rel="up" href="../reference.html" title="Reference">
<link rel="prev" href="ResolveHandler.html" title="Resolve handler requirements">
<link rel="next" href="Sender.html" title="Sender concepts">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="ResolveHandler.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="Sender.html"><img src="../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="asio.reference.Scheduler"></a><a class="link" href="Scheduler.html" title="Scheduler concept">Scheduler concept</a>
</h3></div></div></div>
<pre class="programlisting">template&lt;class S&gt;
concept scheduler =
copy_constructible&lt;remove_cvref_t&lt;S&gt;&gt; &amp;&amp;
equality_comparable&lt;remove_cvref_t&lt;S&gt;&gt; &amp;&amp;
requires(E&amp;&amp; e) {
execution::schedule((E&amp;&amp;)e);
};
</pre>
<p>
None of a scheduler's copy constructor, destructor, equality comparison,
or <code class="computeroutput">swap</code> operation shall exit via an exception.
</p>
<p>
None of these operations, nor a scheduler type's <code class="computeroutput">schedule</code> function,
or associated query functions shall introduce data races as a result of concurrent
invocations of those functions from different threads.
</p>
<p>
For any two (possibly const) values <code class="computeroutput">x1</code> and <code class="computeroutput">x2</code> of
some scheduler type <code class="computeroutput">X</code>, <code class="computeroutput">x1 == x2</code> shall return <code class="computeroutput">true</code>
only if <code class="computeroutput">asio::query(x1, p) == asio::query(x2, p)</code> for every property
<code class="computeroutput">p</code> where both <code class="computeroutput">asio::query(x1, p)</code> and <code class="computeroutput">asio::query(x2,
p)</code> are well-formed and result in a non-void type that is <code class="computeroutput">EqualityComparable</code>
(C++Std [equalitycomparable]). [<span class="emphasis"><em>Note:</em></span> The above requirements
imply that <code class="computeroutput">x1 == x2</code> returns <code class="computeroutput">true</code> if <code class="computeroutput">x1</code>
and <code class="computeroutput">x2</code> can be interchanged with identical effects. A scheduler
may conceptually contain additional properties which are not exposed by a
named property type that can be observed via <code class="computeroutput">asio::query</code>; in
this case, it is up to the concrete scheduler implementation to decide if
these properties affect equality. Returning <code class="computeroutput">false</code> does not necessarily
imply that the effects are not identical. —<span class="emphasis"><em>end note</em></span>]
</p>
<p>
A scheduler type's destructor shall not block pending completion of any receivers
submitted to the sender objects returned from <code class="computeroutput">schedule</code>. [<span class="emphasis"><em>Note:</em></span>
The ability to wait for completion of submitted function objects may be provided
by the execution context that produced the scheduler. —<span class="emphasis"><em>end note</em></span>]
</p>
<p>
In addition to the above requirements, type <code class="computeroutput">S</code> models <code class="computeroutput">scheduler</code>
only if it satisfies the requirements in the Table below.
</p>
<p>
In the Table below,
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem">
<code class="computeroutput">s</code> denotes a (possibly const) scheduler object of type <code class="computeroutput">S</code>,
</li>
<li class="listitem">
<code class="computeroutput">N</code> denotes a type that models <code class="computeroutput">sender</code>, and
</li>
<li class="listitem">
<code class="computeroutput">n</code> denotes a sender object of type <code class="computeroutput">N</code>
</li>
</ul></div>
<div class="table">
<a name="asio.reference.Scheduler.t0"></a><p class="title"><b>Table 25. Scheduler requirements</b></p>
<div class="table-contents"><table class="table" summary="Scheduler requirements">
<colgroup>
<col>
<col>
<col>
</colgroup>
<thead><tr>
<th>
<p>
expression
</p>
</th>
<th>
<p>
return type
</p>
</th>
<th>
<p>
operation semantics
</p>
</th>
</tr></thead>
<tbody><tr>
<td>
<p>
<code class="computeroutput">execution::schedule(s)</code>
</p>
</td>
<td>
<p>
<code class="computeroutput">N</code>
</p>
</td>
<td>
<p>
Evaluates <code class="computeroutput">execution::schedule(s)</code> on the calling thread
to create <code class="computeroutput">N</code>.
</p>
</td>
</tr></tbody>
</table></div>
</div>
<br class="table-break"><p>
<code class="computeroutput">execution::start(o)</code>, where <code class="computeroutput">o</code> is the result of a
call to <code class="computeroutput">execution::connect(N, r)</code> for some receiver object <code class="computeroutput">r</code>,
is required to eagerly submit <code class="computeroutput">r</code> for execution on an execution
agent that <code class="computeroutput">s</code> creates for it. Let <code class="computeroutput">rc</code> be <code class="computeroutput">r</code>
or an object created by copy or move construction from <code class="computeroutput">r</code>. The
semantic constraints on the <code class="computeroutput">sender</code> <code class="computeroutput">N</code> returned from
a scheduler <code class="computeroutput">s</code>'s <code class="computeroutput">schedule</code> function are as follows:
</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem">
If <code class="computeroutput">rc</code>'s <code class="computeroutput">set_error</code> function is called in response
to a submission error, scheduling error, or other internal error, let
<code class="computeroutput">E</code> be an expression that refers to that error if <code class="computeroutput">set_error(rc,
E)</code> is well-formed; otherwise, let <code class="computeroutput">E</code> be an <code class="computeroutput">exception_ptr</code>
that refers to that error. [Note: <code class="computeroutput">E</code> could be the result
of calling <code class="computeroutput">current_exception</code> or <code class="computeroutput">make_exception_ptr</code>.]
The scheduler calls <code class="computeroutput">set_error(rc, E)</code> on an unspecified weakly-parallel
execution agent ([Note: An invocation of <code class="computeroutput">set_error</code> on a
receiver is required to be <code class="computeroutput">noexcept</code>]), and
</li>
<li class="listitem">
If <code class="computeroutput">rc</code>'s <code class="computeroutput">set_error</code> function is called in response
to an exception that propagates out of the invocation of <code class="computeroutput">set_value</code>
on <code class="computeroutput">rc</code>, let <code class="computeroutput">E</code> be <code class="computeroutput">make_exception_ptr(receiver_invocation_error{})</code>
invoked from within a catch clause that has caught the exception. The
executor calls <code class="computeroutput">set_error(rc, E)</code> on an unspecified weakly-parallel
execution agent, and
</li>
<li class="listitem">
A call to <code class="computeroutput">set_done(rc)</code> is made on an unspecified weakly-parallel
execution agent ([Note: An invocation of a receiver's <code class="computeroutput">set_done</code>
function is required to be <code class="computeroutput">noexcept</code>]).
</li>
</ul></div>
<p>
[<span class="emphasis"><em>Note:</em></span> The senders returned from a scheduler's <code class="computeroutput">schedule</code>
function have wide discretion when deciding which of the three receiver functions
to call upon submission. —<span class="emphasis"><em>end note</em></span>]
</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-2020 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="ResolveHandler.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="Sender.html"><img src="../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,98 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Sender concepts</title>
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../index.html" title="Asio">
<link rel="up" href="../reference.html" title="Reference">
<link rel="prev" href="Scheduler.html" title="Scheduler concept">
<link rel="next" href="Service.html" title="Service requirements">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="Scheduler.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="Service.html"><img src="../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="asio.reference.Sender"></a><a class="link" href="Sender.html" title="Sender concepts">Sender concepts</a>
</h3></div></div></div>
<h5>
<a name="asio.reference.Sender.h0"></a>
<span><a name="asio.reference.Sender.sender_and_sender_to"></a></span><a class="link" href="Sender.html#asio.reference.Sender.sender_and_sender_to">sender
and sender_to</a>
</h5>
<pre class="programlisting">template&lt;class S&gt;
concept sender =
move_constructible&lt;remove_cvref_t&lt;S&gt;&gt; &amp;&amp;
!requires {
typename sender_traits&lt;remove_cvref_t&lt;S&gt;&gt;::__unspecialized; // exposition only
};
template&lt;class S, class R&gt;
concept sender_to =
sender&lt;S&gt; &amp;&amp;
receiver&lt;R&gt; &amp;&amp;
requires (S&amp;&amp; s, R&amp;&amp; r) {
execution::connect((S&amp;&amp;) s, (R&amp;&amp;) r);
};
</pre>
<p>
None of these operations shall introduce data races as a result of concurrent
invocations of those functions from different threads.
</p>
<p>
A sender type's destructor shall not block pending completion of the submitted
function objects.
</p>
<p>
[<span class="emphasis"><em>Note:</em></span> The ability to wait for completion of submitted
function objects may be provided by the associated execution context. —<span class="emphasis"><em>end
note</em></span>]
</p>
<h5>
<a name="asio.reference.Sender.h1"></a>
<span><a name="asio.reference.Sender.typed_sender"></a></span><a class="link" href="Sender.html#asio.reference.Sender.typed_sender">typed_sender</a>
</h5>
<p>
A sender is <span class="bold"><strong>typed</strong></span> if it declares what types
it sends through a receiver's channels. The <code class="computeroutput">typed_sender</code> concept
is defined as:
</p>
<pre class="programlisting">template&lt;template&lt;template&lt;class...&gt; class Tuple, template&lt;class...&gt; class Variant&gt; class&gt;
struct has-value-types; // exposition only
template&lt;template&lt;class...&gt; class Variant&gt;
struct has-error-types; // exposition only
template&lt;class S&gt;
concept has-sender-types = // exposition only
requires {
typename has-value-types&lt;S::template value_types&gt;;
typename has-error-types&lt;S::template error_types&gt;;
typename bool_constant&lt;S::sends_done&gt;;
};
template&lt;class S&gt;
concept typed_sender =
sender&lt;S&gt; &amp;&amp;
has-sender-types&lt;sender_traits&lt;remove_cvref_t&lt;S&gt;&gt;&gt;;
</pre>
</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-2020 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="Scheduler.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="Service.html"><img src="../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,74 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Service requirements</title>
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../index.html" title="Asio">
<link rel="up" href="../reference.html" title="Reference">
<link rel="prev" href="Sender.html" title="Sender concepts">
<link rel="next" href="SettableSerialPortOption.html" title="Settable serial port option requirements">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="Sender.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="SettableSerialPortOption.html"><img src="../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="asio.reference.Service"></a><a class="link" href="Service.html" title="Service requirements">Service requirements</a>
</h3></div></div></div>
<p>
A class is a <span class="emphasis"><em>service</em></span> if it is publicly and unambiguously
derived from <code class="computeroutput">execution_context::service</code>, or if it is publicly
and unambiguously derived from another service. For a service <code class="computeroutput">S</code>,
<code class="computeroutput">S::key_type</code> shall be valid and denote a type (C++Std [temp.deduct]),
<code class="computeroutput">is_base_of_v&lt;typename S::key_type, S&gt;</code> shall be <code class="computeroutput">true</code>,
and <code class="computeroutput">S</code> shall satisfy the <code class="computeroutput">Destructible</code> requirements
(C++Std [destructible]).
</p>
<p>
The first parameter of all service constructors shall be an lvalue reference
to <code class="computeroutput">execution_context</code>. This parameter denotes the <code class="computeroutput">execution_context</code>
object that represents a set of services, of which the service object will
be a member. [<span class="emphasis"><em>Note:</em></span> These constructors may be called
by the <code class="computeroutput">make_service</code> function. —<span class="emphasis"><em>end note</em></span>]
</p>
<p>
A service shall provide an explicit constructor with a single parameter of
lvalue reference to <code class="computeroutput">execution_context</code>. [<span class="emphasis"><em>Note:</em></span>
This constructor may be called by the <code class="computeroutput">use_service</code> function.
<span class="emphasis"><em>end note</em></span>]
</p>
<pre class="programlisting">class my_service : public execution_context::service
{
public:
typedef my_service key_type;
explicit my_service(execution_context&amp; ctx);
my_service(execution_context&amp; ctx, int some_value);
private:
virtual void shutdown() noexcept override;
...
};
</pre>
<p>
A service's <code class="computeroutput">shutdown</code> member function shall destroy all copies
of user-defined function objects that are held by the service.
</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-2020 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="Sender.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="SettableSerialPortOption.html"><img src="../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,94 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Settable serial port option requirements</title>
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../index.html" title="Asio">
<link rel="up" href="../reference.html" title="Reference">
<link rel="prev" href="Service.html" title="Service requirements">
<link rel="next" href="SettableSocketOption.html" title="Settable socket option requirements">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="Service.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="SettableSocketOption.html"><img src="../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="asio.reference.SettableSerialPortOption"></a><a class="link" href="SettableSerialPortOption.html" title="Settable serial port option requirements">Settable serial
port option requirements</a>
</h3></div></div></div>
<p>
In the table below, <code class="computeroutput">X</code> denotes a serial port option class, <code class="computeroutput">a</code>
denotes a value of <code class="computeroutput">X</code>, <code class="computeroutput">ec</code> denotes a value of type
<code class="computeroutput">error_code</code>, and <code class="computeroutput">s</code> denotes a value of implementation-defined
type <span class="emphasis"><em><code class="literal">storage</code></em></span> (where <span class="emphasis"><em><code class="literal">storage</code></em></span>
is the type <code class="computeroutput">DCB</code> on Windows and <code class="computeroutput">termios</code> on <span class="emphasis"><em>POSIX</em></span>
platforms), and <code class="computeroutput">u</code> denotes an identifier.
</p>
<div class="table">
<a name="asio.reference.SettableSerialPortOption.t0"></a><p class="title"><b>Table 26. SettableSerialPortOption requirements</b></p>
<div class="table-contents"><table class="table" summary="SettableSerialPortOption requirements">
<colgroup>
<col>
<col>
<col>
</colgroup>
<thead><tr>
<th>
<p>
expression
</p>
</th>
<th>
<p>
type
</p>
</th>
<th>
<p>
assertion/note<br> pre/post-conditions
</p>
</th>
</tr></thead>
<tbody><tr>
<td>
<p>
<code class="computeroutput">const X&amp; u = a;</code><br> <code class="computeroutput">u.store(s, ec);</code>
</p>
</td>
<td>
<p>
<code class="computeroutput">error_code</code>
</p>
</td>
<td>
<p>
Saves the value of the serial port option to the storage.<br>
<br> If successful, sets <code class="computeroutput">ec</code> such that <code class="computeroutput">!ec</code>
is true. If an error occurred, sets <code class="computeroutput">ec</code> such that
<code class="computeroutput">!!ec</code> is true. Returns <code class="computeroutput">ec</code>.
</p>
</td>
</tr></tbody>
</table></div>
</div>
<br class="table-break">
</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-2020 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="Service.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="SettableSocketOption.html"><img src="../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,155 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Settable socket option requirements</title>
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../index.html" title="Asio">
<link rel="up" href="../reference.html" title="Reference">
<link rel="prev" href="SettableSerialPortOption.html" title="Settable serial port option requirements">
<link rel="next" href="ShutdownHandler.html" title="SSL shutdown handler requirements">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="SettableSerialPortOption.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="ShutdownHandler.html"><img src="../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="asio.reference.SettableSocketOption"></a><a class="link" href="SettableSocketOption.html" title="Settable socket option requirements">Settable socket
option requirements</a>
</h3></div></div></div>
<p>
A type <code class="computeroutput">X</code> meets the <code class="computeroutput">SettableSocketOption</code> requirements
if it satisfies the requirements listed below.
</p>
<p>
In the table below, <code class="computeroutput">a</code> denotes a (possibly const) value of type
<code class="computeroutput">X</code>, <code class="computeroutput">p</code> denotes a (possibly const) value that meets
the <a class="link" href="Protocol.html" title="Protocol requirements"><code class="computeroutput">Protocol</code></a>
requirements, and <code class="computeroutput">u</code> denotes an identifier.
</p>
<div class="table">
<a name="asio.reference.SettableSocketOption.t0"></a><p class="title"><b>Table 27. SettableSocketOption requirements for extensible implementations</b></p>
<div class="table-contents"><table class="table" summary="SettableSocketOption requirements for extensible implementations">
<colgroup>
<col>
<col>
<col>
</colgroup>
<thead><tr>
<th>
<p>
expression
</p>
</th>
<th>
<p>
type
</p>
</th>
<th>
<p>
assertion/note<br> pre/post-conditions
</p>
</th>
</tr></thead>
<tbody>
<tr>
<td>
<p>
<code class="computeroutput">a.level(p)</code>
</p>
</td>
<td>
<p>
<code class="computeroutput">int</code>
</p>
</td>
<td>
<p>
Returns a value suitable for passing as the <span class="emphasis"><em>level</em></span>
argument to <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html" target="_top"><code class="computeroutput"><span class="identifier">setsockopt</span><span class="special">()</span></code></a>
(or equivalent).
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">a.name(p)</code>
</p>
</td>
<td>
<p>
<code class="computeroutput">int</code>
</p>
</td>
<td>
<p>
Returns a value suitable for passing as the <span class="emphasis"><em>option_name</em></span>
argument to <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html" target="_top"><code class="computeroutput"><span class="identifier">setsockopt</span><span class="special">()</span></code></a>
(or equivalent).
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">a.data(p)</code>
</p>
</td>
<td>
<p>
<code class="computeroutput">const void*</code>
</p>
</td>
<td>
<p>
Returns a pointer suitable for passing as the <span class="emphasis"><em>option_value</em></span>
argument to <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html" target="_top"><code class="computeroutput"><span class="identifier">setsockopt</span><span class="special">()</span></code></a>
(or equivalent).
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">a.size(p)</code>
</p>
</td>
<td>
<p>
<code class="computeroutput">size_t</code>
</p>
</td>
<td>
<p>
Returns a value suitable for passing as the <span class="emphasis"><em>option_len</em></span>
argument to <span class="emphasis"><em>POSIX</em></span> <a href="http://www.opengroup.org/onlinepubs/9699919799/functions/setsockopt.html" target="_top"><code class="computeroutput"><span class="identifier">setsockopt</span><span class="special">()</span></code></a>
(or equivalent), after appropriate integer conversion has been
performed.
</p>
</td>
</tr>
</tbody>
</table></div>
</div>
<br class="table-break">
</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-2020 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="SettableSerialPortOption.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="ShutdownHandler.html"><img src="../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,106 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>SSL shutdown handler requirements</title>
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../index.html" title="Asio">
<link rel="up" href="../reference.html" title="Reference">
<link rel="prev" href="SettableSocketOption.html" title="Settable socket option requirements">
<link rel="next" href="SignalHandler.html" title="Signal handler requirements">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="SettableSocketOption.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="SignalHandler.html"><img src="../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="asio.reference.ShutdownHandler"></a><a class="link" href="ShutdownHandler.html" title="SSL shutdown handler requirements">SSL shutdown handler
requirements</a>
</h3></div></div></div>
<p>
A shutdown handler must meet the requirements for a <a class="link" href="Handler.html" title="Handlers">handler</a>.
A value <code class="computeroutput">h</code> of a shutdown handler class should work correctly
in the expression <code class="computeroutput">h(ec)</code>, where <code class="computeroutput">ec</code> is an lvalue
of type <code class="computeroutput">const error_code</code>.
</p>
<h5>
<a name="asio.reference.ShutdownHandler.h0"></a>
<span><a name="asio.reference.ShutdownHandler.examples"></a></span><a class="link" href="ShutdownHandler.html#asio.reference.ShutdownHandler.examples">Examples</a>
</h5>
<p>
A free function as a shutdown handler:
</p>
<pre class="programlisting">void shutdown_handler(
const asio::error_code&amp; ec)
{
...
}
</pre>
<p>
A shutdown handler function object:
</p>
<pre class="programlisting">struct shutdown_handler
{
...
void operator()(
const asio::error_code&amp; ec)
{
...
}
...
};
</pre>
<p>
A lambda as a shutdown handler:
</p>
<pre class="programlisting">ssl_stream.async_shutdown(...,
[](const asio::error_code&amp; ec)
{
...
});
</pre>
<p>
A non-static class member function adapted to a shutdown handler using <code class="computeroutput">std::bind()</code>:
</p>
<pre class="programlisting">void my_class::shutdown_handler(
const asio::error_code&amp; ec)
{
...
}
...
ssl_stream.async_shutdown(
std::bind(&amp;my_class::shutdown_handler,
this, std::placeholders::_1));
</pre>
<p>
A non-static class member function adapted to a shutdown handler using <code class="computeroutput">boost::bind()</code>:
</p>
<pre class="programlisting">void my_class::shutdown_handler(
const asio::error_code&amp; ec)
{
...
}
...
ssl_stream.async_shutdown(
boost::bind(&amp;my_class::shutdown_handler,
this, asio::placeholders::error));
</pre>
</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-2020 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="SettableSocketOption.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="SignalHandler.html"><img src="../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,113 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Signal handler requirements</title>
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../index.html" title="Asio">
<link rel="up" href="../reference.html" title="Reference">
<link rel="prev" href="ShutdownHandler.html" title="SSL shutdown handler requirements">
<link rel="next" href="SyncRandomAccessReadDevice.html" title="Buffer-oriented synchronous random-access read device requirements">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="ShutdownHandler.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="SyncRandomAccessReadDevice.html"><img src="../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="asio.reference.SignalHandler"></a><a class="link" href="SignalHandler.html" title="Signal handler requirements">Signal handler requirements</a>
</h3></div></div></div>
<p>
A signal handler must meet the requirements for a <a class="link" href="Handler.html" title="Handlers">handler</a>.
A value <code class="computeroutput">h</code> of a signal handler class should work correctly in
the expression <code class="computeroutput">h(ec, n)</code>, where <code class="computeroutput">ec</code> is an lvalue
of type <code class="computeroutput">const error_code</code> and <code class="computeroutput">n</code> is an lvalue of
type <code class="computeroutput">const int</code>.
</p>
<h5>
<a name="asio.reference.SignalHandler.h0"></a>
<span><a name="asio.reference.SignalHandler.examples"></a></span><a class="link" href="SignalHandler.html#asio.reference.SignalHandler.examples">Examples</a>
</h5>
<p>
A free function as a signal handler:
</p>
<pre class="programlisting">void signal_handler(
const asio::error_code&amp; ec,
int signal_number)
{
...
}
</pre>
<p>
A signal handler function object:
</p>
<pre class="programlisting">struct signal_handler
{
...
void operator()(
const asio::error_code&amp; ec,
int signal_number)
{
...
}
...
};
</pre>
<p>
A lambda as a signal handler:
</p>
<pre class="programlisting">my_signal_set.async_wait(
[](const asio::error_code&amp; ec,
int signal_number)
{
...
});
</pre>
<p>
A non-static class member function adapted to a signal handler using <code class="computeroutput">std::bind()</code>:
</p>
<pre class="programlisting">void my_class::signal_handler(
const asio::error_code&amp; ec,
int signal_number)
{
...
}
...
my_signal_set.async_wait(
std::bind(&amp;my_class::signal_handler,
this, std::placeholders::_1,
std::placeholders::_2));
</pre>
<p>
A non-static class member function adapted to a signal handler using <code class="computeroutput">boost::bind()</code>:
</p>
<pre class="programlisting">void my_class::signal_handler(
const asio::error_code&amp; ec,
int signal_number)
{
...
}
...
my_signal_set.async_wait(
boost::bind(&amp;my_class::signal_handler,
this, asio::placeholders::error,
asio::placeholders::signal_number));
</pre>
</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-2020 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="ShutdownHandler.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="SyncRandomAccessReadDevice.html"><img src="../../next.png" alt="Next"></a>
</div>
</body>
</html>

View File

@@ -0,0 +1,126 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Buffer-oriented synchronous random-access read device requirements</title>
<link rel="stylesheet" href="../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../index.html" title="Asio">
<link rel="up" href="../reference.html" title="Reference">
<link rel="prev" href="SignalHandler.html" title="Signal handler requirements">
<link rel="next" href="SyncRandomAccessWriteDevice.html" title="Buffer-oriented synchronous random-access write device requirements">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="SignalHandler.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="SyncRandomAccessWriteDevice.html"><img src="../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h3 class="title">
<a name="asio.reference.SyncRandomAccessReadDevice"></a><a class="link" href="SyncRandomAccessReadDevice.html" title="Buffer-oriented synchronous random-access read device requirements">Buffer-oriented
synchronous random-access read device requirements</a>
</h3></div></div></div>
<p>
In the table below, <code class="computeroutput">a</code> denotes a synchronous random-access read
device object, <code class="computeroutput">o</code> denotes an offset of type <code class="computeroutput">boost::uint64_t</code>,
<code class="computeroutput">mb</code> denotes an object satisfying <a class="link" href="MutableBufferSequence.html" title="Mutable buffer sequence requirements">mutable
buffer sequence</a> requirements, and <code class="computeroutput">ec</code> denotes an object
of type <code class="computeroutput">error_code</code>.
</p>
<div class="table">
<a name="asio.reference.SyncRandomAccessReadDevice.t0"></a><p class="title"><b>Table 28. Buffer-oriented synchronous random-access read device requirements</b></p>
<div class="table-contents"><table class="table" summary="Buffer-oriented synchronous random-access read device requirements">
<colgroup>
<col>
<col>
<col>
</colgroup>
<thead><tr>
<th>
<p>
operation
</p>
</th>
<th>
<p>
type
</p>
</th>
<th>
<p>
semantics, pre/post-conditions
</p>
</th>
</tr></thead>
<tbody>
<tr>
<td>
<p>
<code class="computeroutput">a.read_some_at(o, mb);</code>
</p>
</td>
<td>
<p>
<code class="computeroutput">size_t</code>
</p>
</td>
<td>
<p>
Equivalent to:
</p>
<pre class="programlisting">error_code ec;
size_t s = a.read_some_at(o, mb, ec);
if (ec) throw system_error(ec);
return s;
</pre>
<p>
</p>
</td>
</tr>
<tr>
<td>
<p>
<code class="computeroutput">a.read_some_at(o, mb, ec);</code>
</p>
</td>
<td>
<p>
<code class="computeroutput">size_t</code>
</p>
</td>
<td>
<p>
Reads one or more bytes of data from the device <code class="computeroutput">a</code>
at offset <code class="computeroutput">o</code>.<br> <br> The mutable buffer sequence
<code class="computeroutput">mb</code> specifies memory where the data should be placed.
The <code class="computeroutput">read_some_at</code> operation shall always fill a buffer
in the sequence completely before proceeding to the next.<br>
<br> If successful, returns the number of bytes read and sets
<code class="computeroutput">ec</code> such that <code class="computeroutput">!ec</code> is true. If an error
occurred, returns <code class="computeroutput">0</code> and sets <code class="computeroutput">ec</code> such
that <code class="computeroutput">!!ec</code> is true.<br> <br> If the total size
of all buffers in the sequence <code class="computeroutput">mb</code> is <code class="computeroutput">0</code>,
the function shall return <code class="computeroutput">0</code> immediately.
</p>
</td>
</tr>
</tbody>
</table></div>
</div>
<br class="table-break">
</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-2020 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="SignalHandler.html"><img src="../../prev.png" alt="Prev"></a><a accesskey="u" href="../reference.html"><img src="../../up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../home.png" alt="Home"></a><a accesskey="n" href="SyncRandomAccessWriteDevice.html"><img src="../../next.png" alt="Next"></a>
</div>
</body>
</html>

Some files were not shown because too many files have changed in this diff Show More