make_strand is in net::

This commit is contained in:
Vinnie Falco
2019-03-02 05:22:02 -08:00
parent dfd3752c23
commit fca4b3ae10
32 changed files with 58 additions and 121 deletions

View File

@@ -1,6 +1,7 @@
Version 226: Version 226:
* Support -fno-exceptions * Support -fno-exceptions
* make_strand is in net::
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------

View File

@@ -90,8 +90,8 @@ Alternatively, we can construct the stream from an executor:
[code_core_3_timeouts_2] [code_core_3_timeouts_2]
The function The function
[link beast.ref.boost__beast__make_strand `make_strand`] returns a strand [@boost:/doc/html/boost_asio/reference/make_strand.html `make_strand`]
constructed from an execution context or executor. When a returns a strand constructed from an execution context or executor. When a
[@boost:/doc/html/boost_asio/reference/strand.html `net::strand`] [@boost:/doc/html/boost_asio/reference/strand.html `net::strand`]
is chosen for the stream's executor, all completion handlers which do not is chosen for the stream's executor, all completion handlers which do not
already have an associated executor will use the strand. This is both a already have an associated executor will use the strand. This is both a

View File

@@ -74,7 +74,6 @@
<member><link linkend="beast.ref.boost__beast__generic_category">generic_category</link></member> <member><link linkend="beast.ref.boost__beast__generic_category">generic_category</link></member>
<member><link linkend="beast.ref.boost__beast__get_lowest_layer">get_lowest_layer</link>&nbsp;<emphasis role="green">&#9733;</emphasis></member> <member><link linkend="beast.ref.boost__beast__get_lowest_layer">get_lowest_layer</link>&nbsp;<emphasis role="green">&#9733;</emphasis></member>
<member><link linkend="beast.ref.boost__beast__iequals">iequals</link></member> <member><link linkend="beast.ref.boost__beast__iequals">iequals</link></member>
<member><link linkend="beast.ref.boost__beast__make_strand">make_strand</link>&nbsp;<emphasis role="green">&#9733;</emphasis></member>
<member><link linkend="beast.ref.boost__beast__to_static_string">to_static_string</link></member> <member><link linkend="beast.ref.boost__beast__to_static_string">to_static_string</link></member>
</simplelist> </simplelist>
</entry> </entry>

View File

@@ -117,8 +117,6 @@
* Add `cdata()` to also return constant readable bytes * Add `cdata()` to also return constant readable bytes
* Eligible member functions are declared `noexcept` * Eligible member functions are declared `noexcept`
* New `make_strand`
* ([issue 1345]) Better * ([issue 1345]) Better
`flat_buffer`, `flat_buffer`,
`multi_buffer` `multi_buffer`

View File

@@ -874,7 +874,7 @@ public:
std::shared_ptr<std::string const> const& doc_root) std::shared_ptr<std::string const> const& doc_root)
: ioc_(ioc) : ioc_(ioc)
, ctx_(ctx) , ctx_(ctx)
, acceptor_(beast::make_strand(ioc)) , acceptor_(net::make_strand(ioc))
, doc_root_(doc_root) , doc_root_(doc_root)
{ {
beast::error_code ec; beast::error_code ec;
@@ -927,7 +927,7 @@ public:
{ {
// The new connection gets its own strand // The new connection gets its own strand
acceptor_.async_accept( acceptor_.async_accept(
beast::make_strand(ioc_), net::make_strand(ioc_),
beast::bind_front_handler( beast::bind_front_handler(
&listener::on_accept, &listener::on_accept,
shared_from_this())); shared_from_this()));

View File

@@ -545,7 +545,7 @@ public:
tcp::endpoint endpoint, tcp::endpoint endpoint,
std::shared_ptr<std::string const> const& doc_root) std::shared_ptr<std::string const> const& doc_root)
: ioc_(ioc) : ioc_(ioc)
, acceptor_(beast::make_strand(ioc)) , acceptor_(net::make_strand(ioc))
, doc_root_(doc_root) , doc_root_(doc_root)
{ {
beast::error_code ec; beast::error_code ec;
@@ -598,7 +598,7 @@ public:
{ {
// The new connection gets its own strand // The new connection gets its own strand
acceptor_.async_accept( acceptor_.async_accept(
beast::make_strand(ioc_), net::make_strand(ioc_),
beast::bind_front_handler( beast::bind_front_handler(
&listener::on_accept, &listener::on_accept,
shared_from_this())); shared_from_this()));

View File

@@ -19,6 +19,7 @@
#include <boost/beast/http.hpp> #include <boost/beast/http.hpp>
#include <boost/beast/ssl.hpp> #include <boost/beast/ssl.hpp>
#include <boost/beast/version.hpp> #include <boost/beast/version.hpp>
#include <boost/asio/strand.hpp>
#include <cstdlib> #include <cstdlib>
#include <functional> #include <functional>
#include <iostream> #include <iostream>
@@ -54,8 +55,8 @@ public:
// ensure that handlers do not execute concurrently. // ensure that handlers do not execute concurrently.
explicit explicit
session(net::io_context& ioc, ssl::context& ctx) session(net::io_context& ioc, ssl::context& ctx)
: resolver_(beast::make_strand(ioc)) : resolver_(net::make_strand(ioc))
, stream_(beast::make_strand(ioc), ctx) , stream_(net::make_strand(ioc), ctx)
{ {
} }

View File

@@ -16,6 +16,7 @@
#include <boost/beast/core.hpp> #include <boost/beast/core.hpp>
#include <boost/beast/http.hpp> #include <boost/beast/http.hpp>
#include <boost/beast/version.hpp> #include <boost/beast/version.hpp>
#include <boost/asio/strand.hpp>
#include <cstdlib> #include <cstdlib>
#include <functional> #include <functional>
#include <iostream> #include <iostream>
@@ -50,8 +51,8 @@ public:
// ensure that handlers do not execute concurrently. // ensure that handlers do not execute concurrently.
explicit explicit
session(net::io_context& ioc) session(net::io_context& ioc)
: resolver_(beast::make_strand(ioc)) : resolver_(net::make_strand(ioc))
, stream_(beast::make_strand(ioc)) , stream_(net::make_strand(ioc))
{ {
} }

View File

@@ -164,8 +164,8 @@ public:
crawl_report& report, crawl_report& report,
net::io_context& ioc) net::io_context& ioc)
: report_(report) : report_(report)
, resolver_(beast::make_strand(ioc)) , resolver_(net::make_strand(ioc))
, stream_(beast::make_strand(ioc)) , stream_(net::make_strand(ioc))
{ {
// Set up the common fields of the request // Set up the common fields of the request
req_.version(11); req_.version(11);

View File

@@ -473,7 +473,7 @@ public:
{ {
// The new connection gets its own strand // The new connection gets its own strand
acceptor_.async_accept( acceptor_.async_accept(
beast::make_strand(ioc_), net::make_strand(ioc_),
beast::bind_front_handler( beast::bind_front_handler(
&listener::on_accept, &listener::on_accept,
shared_from_this())); shared_from_this()));

View File

@@ -362,7 +362,7 @@ public:
tcp::endpoint endpoint, tcp::endpoint endpoint,
std::shared_ptr<std::string const> const& doc_root) std::shared_ptr<std::string const> const& doc_root)
: ioc_(ioc) : ioc_(ioc)
, acceptor_(beast::make_strand(ioc)) , acceptor_(net::make_strand(ioc))
, doc_root_(doc_root) , doc_root_(doc_root)
{ {
beast::error_code ec; beast::error_code ec;
@@ -415,7 +415,7 @@ public:
{ {
// The new connection gets its own strand // The new connection gets its own strand
acceptor_.async_accept( acceptor_.async_accept(
beast::make_strand(ioc_), net::make_strand(ioc_),
beast::bind_front_handler( beast::bind_front_handler(
&listener::on_accept, &listener::on_accept,
shared_from_this())); shared_from_this()));

View File

@@ -570,7 +570,7 @@ public:
std::shared_ptr<std::string const> const& doc_root) std::shared_ptr<std::string const> const& doc_root)
: ioc_(ioc) : ioc_(ioc)
, ctx_(ctx) , ctx_(ctx)
, acceptor_(beast::make_strand(ioc)) , acceptor_(net::make_strand(ioc))
, doc_root_(doc_root) , doc_root_(doc_root)
{ {
beast::error_code ec; beast::error_code ec;
@@ -623,7 +623,7 @@ public:
{ {
// The new connection gets its own strand // The new connection gets its own strand
acceptor_.async_accept( acceptor_.async_accept(
beast::make_strand(ioc_), net::make_strand(ioc_),
beast::bind_front_handler( beast::bind_front_handler(
&listener::on_accept, &listener::on_accept,
shared_from_this())); shared_from_this()));

View File

@@ -413,8 +413,8 @@ public:
std::shared_ptr<std::string const> const& doc_root) std::shared_ptr<std::string const> const& doc_root)
: ioc_(ioc) : ioc_(ioc)
, ctx_(ctx) , ctx_(ctx)
, acceptor_(beast::make_strand(ioc)) , acceptor_(net::make_strand(ioc))
, socket_(beast::make_strand(ioc)) , socket_(net::make_strand(ioc))
, doc_root_(doc_root) , doc_root_(doc_root)
{ {
beast::error_code ec; beast::error_code ec;
@@ -490,7 +490,7 @@ public:
} }
// Make sure each session gets its own strand // Make sure each session gets its own strand
socket_ = tcp::socket(beast::make_strand(ioc_)); socket_ = tcp::socket(net::make_strand(ioc_));
} }
} }
} }

View File

@@ -356,8 +356,8 @@ public:
tcp::endpoint endpoint, tcp::endpoint endpoint,
std::shared_ptr<std::string const> const& doc_root) std::shared_ptr<std::string const> const& doc_root)
: ioc_(ioc) : ioc_(ioc)
, acceptor_(beast::make_strand(ioc)) , acceptor_(net::make_strand(ioc))
, socket_(beast::make_strand(ioc)) , socket_(net::make_strand(ioc))
, doc_root_(doc_root) , doc_root_(doc_root)
{ {
beast::error_code ec; beast::error_code ec;
@@ -430,7 +430,7 @@ public:
} }
// Make sure each session gets its own strand // Make sure each session gets its own strand
socket_ = tcp::socket(beast::make_strand(ioc_)); socket_ = tcp::socket(net::make_strand(ioc_));
} }
} }
} }

View File

@@ -19,6 +19,7 @@
#include <boost/beast/ssl.hpp> #include <boost/beast/ssl.hpp>
#include <boost/beast/websocket.hpp> #include <boost/beast/websocket.hpp>
#include <boost/beast/websocket/ssl.hpp> #include <boost/beast/websocket/ssl.hpp>
#include <boost/asio/strand.hpp>
#include <cstdlib> #include <cstdlib>
#include <functional> #include <functional>
#include <iostream> #include <iostream>
@@ -55,8 +56,8 @@ public:
// Resolver and socket require an io_context // Resolver and socket require an io_context
explicit explicit
session(net::io_context& ioc, ssl::context& ctx) session(net::io_context& ioc, ssl::context& ctx)
: resolver_(beast::make_strand(ioc)) : resolver_(net::make_strand(ioc))
, ws_(beast::make_strand(ioc), ctx) , ws_(net::make_strand(ioc), ctx)
{ {
} }

View File

@@ -15,6 +15,7 @@
#include <boost/beast/core.hpp> #include <boost/beast/core.hpp>
#include <boost/beast/websocket.hpp> #include <boost/beast/websocket.hpp>
#include <boost/asio/strand.hpp>
#include <cstdlib> #include <cstdlib>
#include <functional> #include <functional>
#include <iostream> #include <iostream>
@@ -49,8 +50,8 @@ public:
// Resolver and socket require an io_context // Resolver and socket require an io_context
explicit explicit
session(net::io_context& ioc) session(net::io_context& ioc)
: resolver_(beast::make_strand(ioc)) : resolver_(net::make_strand(ioc))
, ws_(beast::make_strand(ioc)) , ws_(net::make_strand(ioc))
{ {
} }

View File

@@ -183,7 +183,7 @@ public:
tcp::endpoint endpoint) tcp::endpoint endpoint)
: ioc_(ioc) : ioc_(ioc)
, ctx_(ctx) , ctx_(ctx)
, acceptor_(beast::make_strand(ioc)) , acceptor_(net::make_strand(ioc))
{ {
beast::error_code ec; beast::error_code ec;
@@ -235,7 +235,7 @@ public:
{ {
// The new connection gets its own strand // The new connection gets its own strand
acceptor_.async_accept( acceptor_.async_accept(
beast::make_strand(ioc_), net::make_strand(ioc_),
beast::bind_front_handler( beast::bind_front_handler(
&listener::on_accept, &listener::on_accept,
shared_from_this())); shared_from_this()));

View File

@@ -206,7 +206,7 @@ public:
{ {
// The new connection gets its own strand // The new connection gets its own strand
acceptor_.async_accept( acceptor_.async_accept(
beast::make_strand(ioc_), net::make_strand(ioc_),
beast::bind_front_handler( beast::bind_front_handler(
&listener::on_accept, &listener::on_accept,
shared_from_this())); shared_from_this()));

View File

@@ -62,7 +62,7 @@ run()
{ {
// The new connection gets its own strand // The new connection gets its own strand
acceptor_.async_accept( acceptor_.async_accept(
beast::make_strand(ioc_), net::make_strand(ioc_),
beast::bind_front_handler( beast::bind_front_handler(
&listener::on_accept, &listener::on_accept,
shared_from_this())); shared_from_this()));
@@ -94,7 +94,7 @@ on_accept(beast::error_code ec, tcp::socket socket)
// The new connection gets its own strand // The new connection gets its own strand
acceptor_.async_accept( acceptor_.async_accept(
beast::make_strand(ioc_), net::make_strand(ioc_),
beast::bind_front_handler( beast::bind_front_handler(
&listener::on_accept, &listener::on_accept,
shared_from_this())); shared_from_this()));

View File

@@ -249,7 +249,7 @@ public:
net::io_context& ioc, net::io_context& ioc,
tcp::endpoint endpoint) tcp::endpoint endpoint)
: ioc_(ioc) : ioc_(ioc)
, acceptor_(beast::make_strand(ioc)) , acceptor_(net::make_strand(ioc))
{ {
beast::error_code ec; beast::error_code ec;
@@ -301,7 +301,7 @@ public:
{ {
// The new connection gets its own strand // The new connection gets its own strand
acceptor_.async_accept( acceptor_.async_accept(
beast::make_strand(ioc_), net::make_strand(ioc_),
beast::bind_front_handler( beast::bind_front_handler(
&async_listener::on_accept, &async_listener::on_accept,
shared_from_this())); shared_from_this()));

View File

@@ -250,7 +250,7 @@ public:
} }
// Make sure each session gets its own strand // Make sure each session gets its own strand
socket_ = tcp::socket(beast::make_strand(ioc_)); socket_ = tcp::socket(net::make_strand(ioc_));
} }
} }
} }

View File

@@ -151,8 +151,8 @@ public:
net::io_context& ioc, net::io_context& ioc,
tcp::endpoint endpoint) tcp::endpoint endpoint)
: ioc_(ioc) : ioc_(ioc)
, acceptor_(beast::make_strand(ioc)) , acceptor_(net::make_strand(ioc))
, socket_(beast::make_strand(ioc)) , socket_(net::make_strand(ioc))
{ {
beast::error_code ec; beast::error_code ec;
@@ -224,7 +224,7 @@ public:
} }
// Make sure each session gets its own strand // Make sure each session gets its own strand
socket_ = tcp::socket(beast::make_strand(ioc_)); socket_ = tcp::socket(net::make_strand(ioc_));
} }
} }
} }

View File

@@ -36,7 +36,6 @@
#include <boost/beast/core/flat_stream.hpp> #include <boost/beast/core/flat_stream.hpp>
#include <boost/beast/core/handler_ptr.hpp> #include <boost/beast/core/handler_ptr.hpp>
#include <boost/beast/core/make_printable.hpp> #include <boost/beast/core/make_printable.hpp>
#include <boost/beast/core/make_strand.hpp>
#include <boost/beast/core/multi_buffer.hpp> #include <boost/beast/core/multi_buffer.hpp>
#include <boost/beast/core/ostream.hpp> #include <boost/beast/core/ostream.hpp>
#include <boost/beast/core/rate_policy.hpp> #include <boost/beast/core/rate_policy.hpp>

View File

@@ -1,60 +0,0 @@
//
// Copyright (c) 2016-2019 Vinnie Falco (vinnie dot falco at gmail dot com)
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//
// Official repository: https://github.com/boostorg/beast
//
#ifndef BOOST_BEAST_MAKE_STRAND_HPP
#define BOOST_BEAST_MAKE_STRAND_HPP
#include <boost/beast/core/detail/config.hpp>
#include <boost/beast/core/stream_traits.hpp>
#include <boost/asio/is_executor.hpp>
#include <boost/asio/strand.hpp>
#include <type_traits>
namespace boost {
namespace beast {
/** Return a strand usable with the specified execution context.
*/
#if BOOST_BEAST_DOXYGEN
template<class ExecutionContext>
__see_below__
#else
template<class ExecutionContext
,class = typename std::enable_if<
has_get_executor<ExecutionContext>::value &&
std::is_convertible<
ExecutionContext&,
net::execution_context&>::value>::type
>
net::strand<executor_type<ExecutionContext>>
#endif
make_strand(ExecutionContext& context)
{
return net::strand<executor_type<
ExecutionContext>>{context.get_executor()};
}
/** Return a strand usable with the specified executor.
*/
template<class Executor
#if ! BOOST_BEAST_DOXYGEN
, class = typename
net::is_executor<Executor>::type
#endif
>
net::strand<Executor>
make_strand(Executor const& ex)
{
return net::strand<Executor>{ex};
}
} // beast
} // boost
#endif

View File

@@ -57,7 +57,6 @@ add_executable (tests-beast-core
flat_stream.cpp flat_stream.cpp
handler_ptr.cpp handler_ptr.cpp
make_printable.cpp make_printable.cpp
make_strand.cpp
multi_buffer.cpp multi_buffer.cpp
ostream.cpp ostream.cpp
rate_policy.cpp rate_policy.cpp

View File

@@ -45,7 +45,6 @@ local SOURCES =
flat_stream.cpp flat_stream.cpp
handler_ptr.cpp handler_ptr.cpp
make_printable.cpp make_printable.cpp
make_strand.cpp
multi_buffer.cpp multi_buffer.cpp
ostream.cpp ostream.cpp
rate_policy.cpp rate_policy.cpp

View File

@@ -8,7 +8,6 @@
// //
#include <boost/beast/core/detail/config.hpp> #include <boost/beast/core/detail/config.hpp>
#include <boost/beast/core/make_strand.hpp>
#include <boost/beast/core/detail/get_io_context.hpp> #include <boost/beast/core/detail/get_io_context.hpp>
#include <boost/beast/_experimental/unit_test/suite.hpp> #include <boost/beast/_experimental/unit_test/suite.hpp>
#include <boost/asio/strand.hpp> #include <boost/asio/strand.hpp>
@@ -32,7 +31,7 @@ public:
BEAST_EXPECT(get_io_context(none{}) == nullptr); BEAST_EXPECT(get_io_context(none{}) == nullptr);
BEAST_EXPECT(get_io_context(ioc) == &ioc); BEAST_EXPECT(get_io_context(ioc) == &ioc);
BEAST_EXPECT(get_io_context(ioc.get_executor()) == &ioc); BEAST_EXPECT(get_io_context(ioc.get_executor()) == &ioc);
BEAST_EXPECT(get_io_context(make_strand(ioc)) == &ioc); BEAST_EXPECT(get_io_context(net::make_strand(ioc)) == &ioc);
BEAST_EXPECT(get_io_context(net::executor(ioc.get_executor())) == &ioc); BEAST_EXPECT(get_io_context(net::executor(ioc.get_executor())) == &ioc);
#if 0 #if 0
// VFALCO FIXME // VFALCO FIXME

View File

@@ -8,7 +8,7 @@
// //
// Test that header file is self-contained. // Test that header file is self-contained.
#include <boost/beast/core/make_strand.hpp> #include <boost/beast/core/net::make_strand.hpp>
#include <boost/beast/_experimental/unit_test/suite.hpp> #include <boost/beast/_experimental/unit_test/suite.hpp>
#include <boost/asio/executor.hpp> #include <boost/asio/executor.hpp>
@@ -24,15 +24,15 @@ public:
testFunction() testFunction()
{ {
net::io_context ioc; net::io_context ioc;
make_strand(ioc); net::make_strand(ioc);
make_strand(ioc.get_executor()); net::make_strand(ioc.get_executor());
make_strand(make_strand(ioc)); net::make_strand(net::make_strand(ioc));
net::executor ex(ioc.get_executor()); net::executor ex(ioc.get_executor());
make_strand(ex); net::make_strand(ex);
// this *should-not* compile // this *should-not* compile
//make_strand(ex.context()); //net::make_strand(ex.context());
} }
void void
@@ -43,7 +43,7 @@ public:
} }
}; };
BEAST_DEFINE_TESTSUITE(beast,core,make_strand); BEAST_DEFINE_TESTSUITE(beast,core,net::make_strand);
} // beast } // beast
} // boost } // boost

View File

@@ -10,7 +10,6 @@
// Test that header file is self-contained. // Test that header file is self-contained.
#include <boost/beast/websocket/stream.hpp> #include <boost/beast/websocket/stream.hpp>
#include <boost/beast/core/make_strand.hpp>
#include <boost/beast/core/tcp_stream.hpp> #include <boost/beast/core/tcp_stream.hpp>
#include <boost/asio/strand.hpp> #include <boost/asio/strand.hpp>
@@ -158,7 +157,7 @@ public:
{ {
net::io_context ioc; net::io_context ioc;
{ {
websocket::stream<tcp_stream> ws{make_strand(ioc)}; websocket::stream<tcp_stream> ws{net::make_strand(ioc)};
} }
{ {
websocket::stream<tcp_stream> ws(ioc); websocket::stream<tcp_stream> ws(ioc);

View File

@@ -69,7 +69,7 @@ core_3_timeouts_snippets()
//[code_core_3_timeouts_3 //[code_core_3_timeouts_3
// The strand will be used to invoke all completion handlers // The strand will be used to invoke all completion handlers
tcp_stream stream(make_strand(ioc)); tcp_stream stream(net::make_strand(ioc));
//] //]
@@ -111,7 +111,7 @@ core_3_timeouts_snippets()
// We construct the acceptor to use a new strand, and listen // We construct the acceptor to use a new strand, and listen
// on the loopback address with an operating-system assigned port. // on the loopback address with an operating-system assigned port.
net::ip::tcp::acceptor acceptor(make_strand(ioc)); net::ip::tcp::acceptor acceptor(net::make_strand(ioc));
acceptor.bind(net::ip::tcp::endpoint(net::ip::make_address_v4("127.0.0.1"), 0)); acceptor.bind(net::ip::tcp::endpoint(net::ip::make_address_v4("127.0.0.1"), 0));
acceptor.listen(0); acceptor.listen(0);
@@ -120,7 +120,7 @@ core_3_timeouts_snippets()
// connected to the peer. The socket will have its own executor, // connected to the peer. The socket will have its own executor,
// which in the call below is a new strand for the I/O context. // which in the call below is a new strand for the I/O context.
net::ip::tcp::socket s = acceptor.accept(make_strand(ioc)); net::ip::tcp::socket s = acceptor.accept(net::make_strand(ioc));
// Construct a new tcp_stream from the connected socket. // Construct a new tcp_stream from the connected socket.
// The stream will use the strand created when the connection // The stream will use the strand created when the connection

View File

@@ -47,7 +47,7 @@ snippets()
// The `tcp_stream` will be constructed with a new // The `tcp_stream` will be constructed with a new
// strand which uses the specified I/O context. // strand which uses the specified I/O context.
stream<tcp_stream> ws(make_strand(ioc)); stream<tcp_stream> ws(net::make_strand(ioc));
//] //]
} }
@@ -76,7 +76,7 @@ snippets()
//[code_websocket_5f //[code_websocket_5f
// The WebSocket stream will use SSL and a new strand // The WebSocket stream will use SSL and a new strand
stream<ssl_stream<tcp_stream>> wss(make_strand(ioc), ctx); stream<ssl_stream<tcp_stream>> wss(net::make_strand(ioc), ctx);
//] //]

View File

@@ -58,7 +58,7 @@ snippets()
//[code_websocket_1_3 //[code_websocket_1_3
// The stream will use the strand for invoking all completion handlers // The stream will use the strand for invoking all completion handlers
stream<tcp_stream> ws(make_strand(ioc)); stream<tcp_stream> ws(net::make_strand(ioc));
// This overload of accept uses the socket provided for the new connection. // This overload of accept uses the socket provided for the new connection.
// The function `tcp_stream::socket` provides access to the low-level socket // The function `tcp_stream::socket` provides access to the low-level socket