3 <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
4 <title>basic_stream</title>
5 <link rel="stylesheet" href="../../../../../../doc/src/boostbook.css" type="text/css">
6 <meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
7 <link rel="home" href="../../index.html" title="Chapter 1. Boost.Beast">
8 <link rel="up" href="../ref.html" title="This Page Intentionally Left Blank 2/2">
9 <link rel="prev" href="boost__beast__basic_multi_buffer__readable_bytes.html" title="basic_multi_buffer::readable_bytes">
10 <link rel="next" href="boost__beast__basic_stream/async_connect.html" title="basic_stream::async_connect">
12 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
13 <table cellpadding="2" width="100%"><tr>
14 <td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../boost.png"></td>
15 <td align="center"><a href="../../../../../../index.html">Home</a></td>
16 <td align="center"><a href="../../../../../../libs/libraries.htm">Libraries</a></td>
17 <td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
18 <td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
19 <td align="center"><a href="../../../../../../more/index.htm">More</a></td>
22 <div class="spirit-nav">
23 <a accesskey="p" href="boost__beast__basic_multi_buffer__readable_bytes.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../ref.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="boost__beast__basic_stream/async_connect.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
26 <div class="titlepage"><div><div><h4 class="title">
27 <a name="beast.ref.boost__beast__basic_stream"></a><a class="link" href="boost__beast__basic_stream.html" title="basic_stream">basic_stream</a>
28 </h4></div></div></div>
30 A stream socket wrapper with timeouts, an executor, and a rate limit policy.
33 <a name="beast.ref.boost__beast__basic_stream.h0"></a>
34 <span class="phrase"><a name="beast.ref.boost__beast__basic_stream.synopsis"></a></span><a class="link" href="boost__beast__basic_stream.html#beast.ref.boost__beast__basic_stream.synopsis">Synopsis</a>
37 Defined in header <code class="literal"><<a href="../../../../../../boost/beast/core/basic_stream.hpp" target="_top">boost/beast/core/basic_stream.hpp</a>></code>
39 <pre class="programlisting"><span class="keyword">template</span><span class="special"><</span>
40 <span class="keyword">class</span> <a href="../../../../../../doc/html/boost_asio/reference/Protocol.html" target="_top"><span class="emphasis"><em>Protocol</em></span></a><span class="special">,</span>
41 <span class="keyword">class</span> <a href="../../../../../../doc/html/boost_asio/reference/Executor1.html" target="_top"><span class="emphasis"><em>Executor</em></span></a> <span class="special">=</span> <span class="identifier">net</span><span class="special">::</span><span class="identifier">executor</span><span class="special">,</span>
42 <span class="keyword">class</span> <a class="link" href="../concepts/RatePolicy.html" title="RatePolicy"><span class="emphasis"><em>RatePolicy</em></span></a> <span class="special">=</span> <span class="identifier">unlimited_rate_policy</span><span class="special">></span>
43 <span class="keyword">class</span> <span class="identifier">basic_stream</span>
46 <a name="beast.ref.boost__beast__basic_stream.h1"></a>
47 <span class="phrase"><a name="beast.ref.boost__beast__basic_stream.types"></a></span><a class="link" href="boost__beast__basic_stream.html#beast.ref.boost__beast__basic_stream.types">Types</a>
49 <div class="informaltable"><table class="table">
70 <a class="link" href="boost__beast__basic_stream__rebind_executor.html" title="basic_stream::rebind_executor"><span class="bold"><strong>rebind_executor</strong></span></a>
75 Rebinds the stream type to another executor.
82 <a class="link" href="boost__beast__basic_stream/endpoint_type.html" title="basic_stream::endpoint_type"><span class="bold"><strong>endpoint_type</strong></span></a>
94 <a class="link" href="boost__beast__basic_stream/executor_type.html" title="basic_stream::executor_type"><span class="bold"><strong>executor_type</strong></span></a>
99 The type of the executor associated with the stream.
106 <a class="link" href="boost__beast__basic_stream/protocol_type.html" title="basic_stream::protocol_type"><span class="bold"><strong>protocol_type</strong></span></a>
118 <a class="link" href="boost__beast__basic_stream/socket_type.html" title="basic_stream::socket_type"><span class="bold"><strong>socket_type</strong></span></a>
123 The type of the underlying socket.
130 <a name="beast.ref.boost__beast__basic_stream.h2"></a>
131 <span class="phrase"><a name="beast.ref.boost__beast__basic_stream.member_functions"></a></span><a class="link" href="boost__beast__basic_stream.html#beast.ref.boost__beast__basic_stream.member_functions">Member Functions</a>
133 <div class="informaltable"><table class="table">
154 <a class="link" href="boost__beast__basic_stream/async_connect.html" title="basic_stream::async_connect"><span class="bold"><strong>async_connect</strong></span></a>
159 Connect the stream to the specified endpoint asynchronously.
162 Establishes a connection by trying each endpoint in a sequence
170 <a class="link" href="boost__beast__basic_stream/async_read_some.html" title="basic_stream::async_read_some"><span class="bold"><strong>async_read_some</strong></span></a>
175 Read some data asynchronously.
182 <a class="link" href="boost__beast__basic_stream/async_write_some.html" title="basic_stream::async_write_some"><span class="bold"><strong>async_write_some</strong></span></a>
187 Write some data asynchronously.
194 <a class="link" href="boost__beast__basic_stream/basic_stream.html" title="basic_stream::basic_stream"><span class="bold"><strong>basic_stream</strong></span></a>
209 <a class="link" href="boost__beast__basic_stream/cancel.html" title="basic_stream::cancel"><span class="bold"><strong>cancel</strong></span></a>
214 Cancel all asynchronous operations associated with the socket.
221 <a class="link" href="boost__beast__basic_stream/close.html" title="basic_stream::close"><span class="bold"><strong>close</strong></span></a>
226 Close the timed stream.
233 <a class="link" href="boost__beast__basic_stream/connect.html" title="basic_stream::connect"><span class="bold"><strong>connect</strong></span></a>
238 Connect the stream to the specified endpoint.
241 Establishes a connection by trying each endpoint in a sequence.
248 <a class="link" href="boost__beast__basic_stream/expires_after.html" title="basic_stream::expires_after"><span class="bold"><strong>expires_after</strong></span></a>
253 Set the timeout for the next logical operation.
260 <a class="link" href="boost__beast__basic_stream/expires_at.html" title="basic_stream::expires_at"><span class="bold"><strong>expires_at</strong></span></a>
265 Set the timeout for the next logical operation.
272 <a class="link" href="boost__beast__basic_stream/expires_never.html" title="basic_stream::expires_never"><span class="bold"><strong>expires_never</strong></span></a>
277 Disable the timeout for the next logical operation.
284 <a class="link" href="boost__beast__basic_stream/get_executor.html" title="basic_stream::get_executor"><span class="bold"><strong>get_executor</strong></span></a>
289 Get the executor associated with the object.
296 <a class="link" href="boost__beast__basic_stream/operator_eq_.html" title="basic_stream::operator="><span class="bold"><strong>operator=</strong></span></a>
301 Move assignment (deleted).
308 <a class="link" href="boost__beast__basic_stream/rate_policy.html" title="basic_stream::rate_policy"><span class="bold"><strong>rate_policy</strong></span></a>
313 Returns the rate policy associated with the object.
320 <a class="link" href="boost__beast__basic_stream/read_some.html" title="basic_stream::read_some"><span class="bold"><strong>read_some</strong></span></a>
332 <a class="link" href="boost__beast__basic_stream/release_socket.html" title="basic_stream::release_socket"><span class="bold"><strong>release_socket</strong></span></a>
337 Release ownership of the underlying socket.
344 <a class="link" href="boost__beast__basic_stream/socket.html" title="basic_stream::socket"><span class="bold"><strong>socket</strong></span></a>
349 Return a reference to the underlying socket.
356 <a class="link" href="boost__beast__basic_stream/write_some.html" title="basic_stream::write_some"><span class="bold"><strong>write_some</strong></span></a>
368 <a class="link" href="boost__beast__basic_stream/basic_stream_dtor_.html" title="basic_stream::~basic_stream"><span class="bold"><strong>~basic_stream</strong></span></a>
380 <a name="beast.ref.boost__beast__basic_stream.h3"></a>
381 <span class="phrase"><a name="beast.ref.boost__beast__basic_stream.description"></a></span><a class="link" href="boost__beast__basic_stream.html#beast.ref.boost__beast__basic_stream.description">Description</a>
384 This stream wraps a <code class="computeroutput"><span class="identifier">net</span><span class="special">::</span><span class="identifier">basic_stream_socket</span></code> to provide the following
387 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
388 <li class="listitem">
389 An <span class="emphasis"><em>Executor</em></span> may be associated with the stream, which
390 will be used to invoke any completion handlers which do not already have
391 an associated executor. This achieves support for <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1322r0.html" target="_top">[P1322R0]
392 Networking TS enhancement to enable custom I/O executors</a>.
394 <li class="listitem">
395 Timeouts may be specified for each logical asynchronous operation performing
396 any reading, writing, or connecting.
398 <li class="listitem">
399 A <span class="emphasis"><em>RatePolicy</em></span> may be associated with the stream,
400 to implement rate limiting through the policy's interface.
404 Although the stream supports multiple concurrent outstanding asynchronous
405 operations, the stream object is not thread-safe. The caller is responsible
406 for ensuring that the stream is accessed from only one thread at a time.
407 This includes the times when the stream, and its underlying socket, are accessed
408 by the networking implementation. To meet this thread safety requirement,
409 all asynchronous operations must be performed by the stream within the same
410 implicit strand (only one thread <code class="computeroutput"><span class="identifier">net</span><span class="special">::</span><span class="identifier">io_context</span><span class="special">::</span><span class="identifier">run</span></code>)
411 or within the same explicit strand, such as an instance of <code class="computeroutput"><span class="identifier">net</span><span class="special">::</span><span class="identifier">strand</span></code>.
412 Completion handlers with explicit associated executors (such as those arising
413 from use of <code class="computeroutput"><span class="identifier">net</span><span class="special">::</span><span class="identifier">bind_executor</span></code>) will be invoked by the stream
414 using the associated executor. Otherwise, the completion handler will be
415 invoked by the executor associated with the stream upon construction. The
416 type of executor used with this stream must meet the following requirements:
418 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
419 Function objects submitted to the executor shall never run concurrently
423 The executor type <code class="computeroutput"><span class="identifier">net</span><span class="special">::</span><span class="identifier">strand</span></code> meets these requirements. Use of
424 a strand as the executor in the stream class template offers an additional
425 notational convenience: the strand does not need to be specified in each
426 individual initiating function call. Unlike other stream wrappers, the underlying
427 socket is accessed through the <a class="link" href="boost__beast__basic_stream/socket.html" title="basic_stream::socket"><code class="computeroutput"><span class="identifier">basic_stream</span><span class="special">::</span><span class="identifier">socket</span></code></a> member function instead of
428 <code class="computeroutput"><span class="identifier">next_layer</span></code>. This causes the
429 <a class="link" href="boost__beast__basic_stream.html" title="basic_stream"><code class="computeroutput"><span class="identifier">basic_stream</span></code></a>
430 to be returned in calls to <a class="link" href="boost__beast__get_lowest_layer.html" title="get_lowest_layer"><code class="computeroutput"><span class="identifier">get_lowest_layer</span></code></a>.
433 <a name="beast.ref.boost__beast__basic_stream.h4"></a>
434 <span class="phrase"><a name="beast.ref.boost__beast__basic_stream.usage"></a></span><a class="link" href="boost__beast__basic_stream.html#beast.ref.boost__beast__basic_stream.usage">Usage</a>
437 To use this stream declare an instance of the class. Then, before each logical
438 operation for which a timeout is desired, call <a class="link" href="boost__beast__basic_stream/expires_after.html" title="basic_stream::expires_after"><code class="computeroutput"><span class="identifier">basic_stream</span><span class="special">::</span><span class="identifier">expires_after</span></code></a> with a duration, or
439 call <a class="link" href="boost__beast__basic_stream/expires_at.html" title="basic_stream::expires_at"><code class="computeroutput"><span class="identifier">basic_stream</span><span class="special">::</span><span class="identifier">expires_at</span></code></a> with a time point. Alternatively,
440 call <a class="link" href="boost__beast__basic_stream/expires_never.html" title="basic_stream::expires_never"><code class="computeroutput"><span class="identifier">basic_stream</span><span class="special">::</span><span class="identifier">expires_never</span></code></a> to disable the timeout
441 for subsequent logical operations. A logical operation is any series of one
442 or more direct or indirect calls to the timeout stream's asynchronous read,
443 asynchronous write, or asynchronous connect functions. When a timeout is
444 set and a mixed operation is performed (one that includes both reads and
445 writes, for example) the timeout applies to all of the intermediate asynchronous
446 operations used in the enclosing operation. This allows timeouts to be applied
447 to stream algorithms which were not written specifically to allow for timeouts,
448 when those algorithms are passed a timeout stream with a timeout set. When
449 a timeout occurs the socket will be closed, canceling any pending I/O operations.
450 The completion handlers for these canceled operations will be invoked with
451 the error <a class="link" href="boost__beast__error.html" title="error"><code class="computeroutput"><span class="identifier">timeout</span></code></a>.
454 <a name="beast.ref.boost__beast__basic_stream.h5"></a>
455 <span class="phrase"><a name="beast.ref.boost__beast__basic_stream.examples"></a></span><a class="link" href="boost__beast__basic_stream.html#beast.ref.boost__beast__basic_stream.examples">Examples</a>
458 This function reads an HTTP request with a timeout, then sends the HTTP response
459 with a different timeout.
461 <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">process_http_1</span> <span class="special">(</span><span class="identifier">tcp_stream</span><span class="special">&</span> <span class="identifier">stream</span><span class="special">,</span> <span class="identifier">net</span><span class="special">::</span><span class="identifier">yield_context</span> <span class="identifier">yield</span><span class="special">)</span>
462 <span class="special">{</span>
463 <span class="identifier">flat_buffer</span> <span class="identifier">buffer</span><span class="special">;</span>
464 <span class="identifier">http</span><span class="special">::</span><span class="identifier">request</span><span class="special"><</span><span class="identifier">http</span><span class="special">::</span><span class="identifier">empty_body</span><span class="special">></span> <span class="identifier">req</span><span class="special">;</span>
466 <span class="comment">// Read the request, with a 15 second timeout</span>
467 <span class="identifier">stream</span><span class="special">.</span><span class="identifier">expires_after</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">seconds</span><span class="special">(</span><span class="number">15</span><span class="special">));</span>
468 <span class="identifier">http</span><span class="special">::</span><span class="identifier">async_read</span><span class="special">(</span><span class="identifier">stream</span><span class="special">,</span> <span class="identifier">buffer</span><span class="special">,</span> <span class="identifier">req</span><span class="special">,</span> <span class="identifier">yield</span><span class="special">);</span>
470 <span class="comment">// Calculate the response</span>
471 <span class="identifier">http</span><span class="special">::</span><span class="identifier">response</span><span class="special"><</span><span class="identifier">http</span><span class="special">::</span><span class="identifier">string_body</span><span class="special">></span> <span class="identifier">res</span> <span class="special">=</span> <span class="identifier">make_response</span><span class="special">(</span><span class="identifier">req</span><span class="special">);</span>
473 <span class="comment">// Send the response, with a 30 second timeout.</span>
474 <span class="identifier">stream</span><span class="special">.</span><span class="identifier">expires_after</span> <span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">seconds</span><span class="special">(</span><span class="number">30</span><span class="special">));</span>
475 <span class="identifier">http</span><span class="special">::</span><span class="identifier">async_write</span> <span class="special">(</span><span class="identifier">stream</span><span class="special">,</span> <span class="identifier">res</span><span class="special">,</span> <span class="identifier">yield</span><span class="special">);</span>
476 <span class="special">}</span>
479 The example above could be expressed using a single timeout with a simple
480 modification. The function that follows first reads an HTTP request then
481 sends the HTTP response, with a single timeout that applies to the entire
482 combined operation of reading and writing:
484 <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">process_http_2</span> <span class="special">(</span><span class="identifier">tcp_stream</span><span class="special">&</span> <span class="identifier">stream</span><span class="special">,</span> <span class="identifier">net</span><span class="special">::</span><span class="identifier">yield_context</span> <span class="identifier">yield</span><span class="special">)</span>
485 <span class="special">{</span>
486 <span class="identifier">flat_buffer</span> <span class="identifier">buffer</span><span class="special">;</span>
487 <span class="identifier">http</span><span class="special">::</span><span class="identifier">request</span><span class="special"><</span><span class="identifier">http</span><span class="special">::</span><span class="identifier">empty_body</span><span class="special">></span> <span class="identifier">req</span><span class="special">;</span>
489 <span class="comment">// Require that the read and write combined take no longer than 30 seconds</span>
490 <span class="identifier">stream</span><span class="special">.</span><span class="identifier">expires_after</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">seconds</span><span class="special">(</span><span class="number">30</span><span class="special">));</span>
492 <span class="identifier">http</span><span class="special">::</span><span class="identifier">async_read</span><span class="special">(</span><span class="identifier">stream</span><span class="special">,</span> <span class="identifier">buffer</span><span class="special">,</span> <span class="identifier">req</span><span class="special">,</span> <span class="identifier">yield</span><span class="special">);</span>
494 <span class="identifier">http</span><span class="special">::</span><span class="identifier">response</span><span class="special"><</span><span class="identifier">http</span><span class="special">::</span><span class="identifier">string_body</span><span class="special">></span> <span class="identifier">res</span> <span class="special">=</span> <span class="identifier">make_response</span><span class="special">(</span><span class="identifier">req</span><span class="special">);</span>
495 <span class="identifier">http</span><span class="special">::</span><span class="identifier">async_write</span> <span class="special">(</span><span class="identifier">stream</span><span class="special">,</span> <span class="identifier">res</span><span class="special">,</span> <span class="identifier">yield</span><span class="special">);</span>
496 <span class="special">}</span>
499 Some stream algorithms, such as <code class="computeroutput"><span class="identifier">ssl</span><span class="special">::</span><span class="identifier">stream</span><span class="special">::</span><span class="identifier">async_handshake</span></code>
500 perform both reads and writes. A timeout set before calling the initiating
501 function of such composite stream algorithms will apply to the entire composite
502 operation. For example, a timeout may be set on performing the SSL handshake
505 <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">do_ssl_handshake</span> <span class="special">(</span><span class="identifier">net</span><span class="special">::</span><span class="identifier">ssl</span><span class="special">::</span><span class="identifier">stream</span><span class="special"><</span><span class="identifier">tcp_stream</span><span class="special">>&</span> <span class="identifier">stream</span><span class="special">,</span> <span class="identifier">net</span><span class="special">::</span><span class="identifier">yield_context</span> <span class="identifier">yield</span><span class="special">)</span>
506 <span class="special">{</span>
507 <span class="comment">// Require that the SSL handshake take no longer than 10 seconds</span>
508 <span class="identifier">stream</span><span class="special">.</span><span class="identifier">expires_after</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">seconds</span><span class="special">(</span><span class="number">10</span><span class="special">));</span>
510 <span class="identifier">stream</span><span class="special">.</span><span class="identifier">async_handshake</span><span class="special">(</span><span class="identifier">net</span><span class="special">::</span><span class="identifier">ssl</span><span class="special">::</span><span class="identifier">stream_base</span><span class="special">::</span><span class="identifier">client</span><span class="special">,</span> <span class="identifier">yield</span><span class="special">);</span>
511 <span class="special">}</span>
514 <a name="beast.ref.boost__beast__basic_stream.h6"></a>
515 <span class="phrase"><a name="beast.ref.boost__beast__basic_stream.blocking_i_o"></a></span><a class="link" href="boost__beast__basic_stream.html#beast.ref.boost__beast__basic_stream.blocking_i_o">Blocking
519 Synchronous functions behave identically as that of the wrapped <code class="computeroutput"><span class="identifier">net</span><span class="special">::</span><span class="identifier">basic_stream_socket</span></code>.
520 Timeouts are not available when performing blocking calls.
523 <a name="beast.ref.boost__beast__basic_stream.h7"></a>
524 <span class="phrase"><a name="beast.ref.boost__beast__basic_stream.template_parameters"></a></span><a class="link" href="boost__beast__basic_stream.html#beast.ref.boost__beast__basic_stream.template_parameters">Template
527 <div class="informaltable"><table class="table">
548 <code class="computeroutput"><span class="identifier">Protocol</span></code>
553 A type meeting the requirements of <span class="emphasis"><em>Protocol</em></span>
554 representing the protocol the protocol to use for the basic stream
555 socket. A common choice is <code class="computeroutput"><span class="identifier">net</span><span class="special">::</span><span class="identifier">ip</span><span class="special">::</span><span class="identifier">tcp</span></code>.
562 <code class="computeroutput"><span class="identifier">Executor</span></code>
567 A type meeting the requirements of <span class="emphasis"><em>Executor</em></span>
568 to be used for submitting all completion handlers which do not
569 already have an associated executor. If this type is omitted, the
570 default of <code class="computeroutput"><span class="identifier">net</span><span class="special">::</span><span class="identifier">executor</span></code>
578 <a name="beast.ref.boost__beast__basic_stream.h8"></a>
579 <span class="phrase"><a name="beast.ref.boost__beast__basic_stream.thread_safety"></a></span><a class="link" href="boost__beast__basic_stream.html#beast.ref.boost__beast__basic_stream.thread_safety">Thread
583 <span class="emphasis"><em>Distinct objects</em></span>: Safe.
586 <span class="emphasis"><em>Shared objects</em></span>: Unsafe. The application must also ensure
587 that all asynchronous operations are performed within the same implicit or
591 <a name="beast.ref.boost__beast__basic_stream.h9"></a>
592 <span class="phrase"><a name="beast.ref.boost__beast__basic_stream.see_also"></a></span><a class="link" href="boost__beast__basic_stream.html#beast.ref.boost__beast__basic_stream.see_also">See
595 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
596 <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1322r0.html" target="_top">[P1322R0]
597 Networking TS enhancement to enable custom I/O executors</a>.
600 Convenience header <code class="literal"><<a href="../../../../../../boost/beast/core.hpp" target="_top">boost/beast/core.hpp</a>></code>
603 <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
604 <td align="left"></td>
605 <td align="right"><div class="copyright-footer">Copyright © 2016-2019 Vinnie
607 Distributed under the Boost Software License, Version 1.0. (See accompanying
608 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>)
613 <div class="spirit-nav">
614 <a accesskey="p" href="boost__beast__basic_multi_buffer__readable_bytes.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../ref.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="boost__beast__basic_stream/async_connect.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>