Imported Upstream version 1.72.0
[platform/upstream/boost.git] / libs / beast / doc / html / beast / ref / boost__beast__basic_stream.html
1 <html>
2 <head>
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&#160;1.&#160;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">
11 </head>
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>
20 </tr></table>
21 <hr>
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>
24 </div>
25 <div class="section">
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>
29 <p>
30         A stream socket wrapper with timeouts, an executor, and a rate limit policy.
31       </p>
32 <h5>
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>
35       </h5>
36 <p>
37         Defined in header <code class="literal">&lt;<a href="../../../../../../boost/beast/core/basic_stream.hpp" target="_top">boost/beast/core/basic_stream.hpp</a>&gt;</code>
38       </p>
39 <pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</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">&gt;</span>
43 <span class="keyword">class</span> <span class="identifier">basic_stream</span>
44 </pre>
45 <h5>
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>
48       </h5>
49 <div class="informaltable"><table class="table">
50 <colgroup>
51 <col>
52 <col>
53 </colgroup>
54 <thead><tr>
55 <th>
56                 <p>
57                   Name
58                 </p>
59               </th>
60 <th>
61                 <p>
62                   Description
63                 </p>
64               </th>
65 </tr></thead>
66 <tbody>
67 <tr>
68 <td>
69                 <p>
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>
71                 </p>
72               </td>
73 <td>
74                 <p>
75                   Rebinds the stream type to another executor.
76                 </p>
77               </td>
78 </tr>
79 <tr>
80 <td>
81                 <p>
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>
83                 </p>
84               </td>
85 <td>
86                 <p>
87                   The endpoint type.
88                 </p>
89               </td>
90 </tr>
91 <tr>
92 <td>
93                 <p>
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>
95                 </p>
96               </td>
97 <td>
98                 <p>
99                   The type of the executor associated with the stream.
100                 </p>
101               </td>
102 </tr>
103 <tr>
104 <td>
105                 <p>
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>
107                 </p>
108               </td>
109 <td>
110                 <p>
111                   The protocol type.
112                 </p>
113               </td>
114 </tr>
115 <tr>
116 <td>
117                 <p>
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>
119                 </p>
120               </td>
121 <td>
122                 <p>
123                   The type of the underlying socket.
124                 </p>
125               </td>
126 </tr>
127 </tbody>
128 </table></div>
129 <h5>
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>
132       </h5>
133 <div class="informaltable"><table class="table">
134 <colgroup>
135 <col>
136 <col>
137 </colgroup>
138 <thead><tr>
139 <th>
140                 <p>
141                   Name
142                 </p>
143               </th>
144 <th>
145                 <p>
146                   Description
147                 </p>
148               </th>
149 </tr></thead>
150 <tbody>
151 <tr>
152 <td>
153                 <p>
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>
155                 </p>
156               </td>
157 <td>
158                 <p>
159                   Connect the stream to the specified endpoint asynchronously.
160                 </p>
161                 <p>
162                   Establishes a connection by trying each endpoint in a sequence
163                   asynchronously.
164                 </p>
165               </td>
166 </tr>
167 <tr>
168 <td>
169                 <p>
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>
171                 </p>
172               </td>
173 <td>
174                 <p>
175                   Read some data asynchronously.
176                 </p>
177               </td>
178 </tr>
179 <tr>
180 <td>
181                 <p>
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>
183                 </p>
184               </td>
185 <td>
186                 <p>
187                   Write some data asynchronously.
188                 </p>
189               </td>
190 </tr>
191 <tr>
192 <td>
193                 <p>
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>
195                 </p>
196               </td>
197 <td>
198                 <p>
199                   Constructor.
200                 </p>
201                 <p>
202                   Move constructor.
203                 </p>
204               </td>
205 </tr>
206 <tr>
207 <td>
208                 <p>
209                   <a class="link" href="boost__beast__basic_stream/cancel.html" title="basic_stream::cancel"><span class="bold"><strong>cancel</strong></span></a>
210                 </p>
211               </td>
212 <td>
213                 <p>
214                   Cancel all asynchronous operations associated with the socket.
215                 </p>
216               </td>
217 </tr>
218 <tr>
219 <td>
220                 <p>
221                   <a class="link" href="boost__beast__basic_stream/close.html" title="basic_stream::close"><span class="bold"><strong>close</strong></span></a>
222                 </p>
223               </td>
224 <td>
225                 <p>
226                   Close the timed stream.
227                 </p>
228               </td>
229 </tr>
230 <tr>
231 <td>
232                 <p>
233                   <a class="link" href="boost__beast__basic_stream/connect.html" title="basic_stream::connect"><span class="bold"><strong>connect</strong></span></a>
234                 </p>
235               </td>
236 <td>
237                 <p>
238                   Connect the stream to the specified endpoint.
239                 </p>
240                 <p>
241                   Establishes a connection by trying each endpoint in a sequence.
242                 </p>
243               </td>
244 </tr>
245 <tr>
246 <td>
247                 <p>
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>
249                 </p>
250               </td>
251 <td>
252                 <p>
253                   Set the timeout for the next logical operation.
254                 </p>
255               </td>
256 </tr>
257 <tr>
258 <td>
259                 <p>
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>
261                 </p>
262               </td>
263 <td>
264                 <p>
265                   Set the timeout for the next logical operation.
266                 </p>
267               </td>
268 </tr>
269 <tr>
270 <td>
271                 <p>
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>
273                 </p>
274               </td>
275 <td>
276                 <p>
277                   Disable the timeout for the next logical operation.
278                 </p>
279               </td>
280 </tr>
281 <tr>
282 <td>
283                 <p>
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>
285                 </p>
286               </td>
287 <td>
288                 <p>
289                   Get the executor associated with the object.
290                 </p>
291               </td>
292 </tr>
293 <tr>
294 <td>
295                 <p>
296                   <a class="link" href="boost__beast__basic_stream/operator_eq_.html" title="basic_stream::operator="><span class="bold"><strong>operator=</strong></span></a>
297                 </p>
298               </td>
299 <td>
300                 <p>
301                   Move assignment (deleted).
302                 </p>
303               </td>
304 </tr>
305 <tr>
306 <td>
307                 <p>
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>
309                 </p>
310               </td>
311 <td>
312                 <p>
313                   Returns the rate policy associated with the object.
314                 </p>
315               </td>
316 </tr>
317 <tr>
318 <td>
319                 <p>
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>
321                 </p>
322               </td>
323 <td>
324                 <p>
325                   Read some data.
326                 </p>
327               </td>
328 </tr>
329 <tr>
330 <td>
331                 <p>
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>
333                 </p>
334               </td>
335 <td>
336                 <p>
337                   Release ownership of the underlying socket.
338                 </p>
339               </td>
340 </tr>
341 <tr>
342 <td>
343                 <p>
344                   <a class="link" href="boost__beast__basic_stream/socket.html" title="basic_stream::socket"><span class="bold"><strong>socket</strong></span></a>
345                 </p>
346               </td>
347 <td>
348                 <p>
349                   Return a reference to the underlying socket.
350                 </p>
351               </td>
352 </tr>
353 <tr>
354 <td>
355                 <p>
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>
357                 </p>
358               </td>
359 <td>
360                 <p>
361                   Write some data.
362                 </p>
363               </td>
364 </tr>
365 <tr>
366 <td>
367                 <p>
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>
369                 </p>
370               </td>
371 <td>
372                 <p>
373                   Destructor.
374                 </p>
375               </td>
376 </tr>
377 </tbody>
378 </table></div>
379 <h5>
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>
382       </h5>
383 <p>
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
385         features:
386       </p>
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>.
393           </li>
394 <li class="listitem">
395             Timeouts may be specified for each logical asynchronous operation performing
396             any reading, writing, or connecting.
397           </li>
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.
401           </li>
402 </ul></div>
403 <p>
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:
417       </p>
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
420             with each other.
421           </li></ul></div>
422 <p>
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>.
431       </p>
432 <h5>
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>
435       </h5>
436 <p>
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>.
452       </p>
453 <h5>
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>
456       </h5>
457 <p>
458         This function reads an HTTP request with a timeout, then sends the HTTP response
459         with a different timeout.
460       </p>
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">&amp;</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">&lt;</span><span class="identifier">http</span><span class="special">::</span><span class="identifier">empty_body</span><span class="special">&gt;</span> <span class="identifier">req</span><span class="special">;</span>
465
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>
469
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">&lt;</span><span class="identifier">http</span><span class="special">::</span><span class="identifier">string_body</span><span class="special">&gt;</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>
472
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>
477 </pre>
478 <p>
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:
483       </p>
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">&amp;</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">&lt;</span><span class="identifier">http</span><span class="special">::</span><span class="identifier">empty_body</span><span class="special">&gt;</span> <span class="identifier">req</span><span class="special">;</span>
488
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>
491
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>
493
494     <span class="identifier">http</span><span class="special">::</span><span class="identifier">response</span><span class="special">&lt;</span><span class="identifier">http</span><span class="special">::</span><span class="identifier">string_body</span><span class="special">&gt;</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>
497 </pre>
498 <p>
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
503         thusly:
504       </p>
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">&lt;</span><span class="identifier">tcp_stream</span><span class="special">&gt;&amp;</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>
509
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>
512 </pre>
513 <h5>
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
516         I/O</a>
517       </h5>
518 <p>
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.
521       </p>
522 <h5>
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
525         Parameters</a>
526       </h5>
527 <div class="informaltable"><table class="table">
528 <colgroup>
529 <col>
530 <col>
531 </colgroup>
532 <thead><tr>
533 <th>
534                 <p>
535                   Type
536                 </p>
537               </th>
538 <th>
539                 <p>
540                   Description
541                 </p>
542               </th>
543 </tr></thead>
544 <tbody>
545 <tr>
546 <td>
547                 <p>
548                   <code class="computeroutput"><span class="identifier">Protocol</span></code>
549                 </p>
550               </td>
551 <td>
552                 <p>
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>.
556                 </p>
557               </td>
558 </tr>
559 <tr>
560 <td>
561                 <p>
562                   <code class="computeroutput"><span class="identifier">Executor</span></code>
563                 </p>
564               </td>
565 <td>
566                 <p>
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>
571                   will be used.
572                 </p>
573               </td>
574 </tr>
575 </tbody>
576 </table></div>
577 <h5>
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
580         Safety</a>
581       </h5>
582 <p>
583         <span class="emphasis"><em>Distinct objects</em></span>: Safe.
584       </p>
585 <p>
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
588         explicit strand.
589       </p>
590 <h5>
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
593         Also</a>
594       </h5>
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>.
598           </li></ul></div>
599 <p>
600         Convenience header <code class="literal">&lt;<a href="../../../../../../boost/beast/core.hpp" target="_top">boost/beast/core.hpp</a>&gt;</code>
601       </p>
602 </div>
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 &#169; 2016-2019 Vinnie
606       Falco<p>
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>)
609       </p>
610 </div></td>
611 </tr></table>
612 <hr>
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>
615 </div>
616 </body>
617 </html>