mirror of
https://github.com/boostorg/asio.git
synced 2026-02-28 03:22:08 +00:00
The following example illustrates a simple asynchronous operation that
implements an echo protocol in terms of a coroutine:
template <typename CompletionToken>
auto async_echo(tcp::socket& socket,
CompletionToken&& token)
{
return boost::asio::async_initiate<
CompletionToken, void(boost::system::error_code)>(
boost::asio::experimental::co_composed<
void(boost::system::error_code)>(
[](auto state, tcp::socket& socket) -> void
{
try
{
state.throw_if_cancelled(true);
state.reset_cancellation_state(
boost::asio::enable_terminal_cancellation());
for (;;)
{
char data[1024];
std::size_t n = co_await socket.async_read_some(
boost::asio::buffer(data), boost::asio::deferred);
co_await boost::asio::async_write(socket,
boost::asio::buffer(data, n), boost::asio::deferred);
}
}
catch (const boost::system::system_error& e)
{
co_return {e.code()};
}
}, socket),
token, std::ref(socket));
}
60 lines
2.0 KiB
Plaintext
60 lines
2.0 KiB
Plaintext
#
|
|
# Copyright (c) 2003-2022 Christopher M. Kohlhoff (chris at kohlhoff 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)
|
|
#
|
|
|
|
import os ;
|
|
import feature ;
|
|
|
|
lib socket ; # SOLARIS
|
|
lib nsl ; # SOLARIS
|
|
lib ws2_32 ; # NT
|
|
lib mswsock ; # NT
|
|
lib ipv6 ; # HPUX
|
|
lib network ; # HAIKU
|
|
|
|
local USE_SELECT =
|
|
<define>BOOST_ASIO_DISABLE_EPOLL
|
|
<define>BOOST_ASIO_DISABLE_KQUEUE
|
|
<define>BOOST_ASIO_DISABLE_IOCP
|
|
;
|
|
|
|
project
|
|
: requirements
|
|
<library>/boost/date_time//boost_date_time
|
|
<library>/boost/system//boost_system
|
|
<library>/boost/chrono//boost_chrono
|
|
<define>BOOST_ALL_NO_LIB=1
|
|
<threading>multi
|
|
<target-os>solaris:<library>socket
|
|
<target-os>solaris:<library>nsl
|
|
<target-os>windows:<define>_WIN32_WINNT=0x0501
|
|
<target-os>windows,<toolset>gcc:<library>ws2_32
|
|
<target-os>windows,<toolset>gcc:<library>mswsock
|
|
<target-os>windows,<toolset>gcc-cygwin:<define>__USE_W32_SOCKETS
|
|
<target-os>hpux,<toolset>gcc:<define>_XOPEN_SOURCE_EXTENDED
|
|
<target-os>hpux:<library>ipv6
|
|
<target-os>haiku:<library>network
|
|
;
|
|
|
|
test-suite "asio-experimental" :
|
|
[ run awaitable_operators.cpp ]
|
|
[ run awaitable_operators.cpp : : : $(USE_SELECT) : awaitable_operators_select ]
|
|
[ run basic_channel.cpp ]
|
|
[ run basic_channel.cpp : : : $(USE_SELECT) : basic_channel_select ]
|
|
[ run basic_concurrent_channel.cpp ]
|
|
[ run basic_concurrent_channel.cpp : : : $(USE_SELECT) : basic_concurrent_channel_select ]
|
|
[ run channel.cpp ]
|
|
[ run channel.cpp : : : $(USE_SELECT) : channel_select ]
|
|
[ run channel_traits.cpp ]
|
|
[ run channel_traits.cpp : : : $(USE_SELECT) : channel_traits_select ]
|
|
[ run co_composed.cpp ]
|
|
[ run co_composed.cpp : : : $(USE_SELECT) : co_composed_select ]
|
|
[ run concurrent_channel.cpp ]
|
|
[ run concurrent_channel.cpp : : : $(USE_SELECT) : concurrent_channel_select ]
|
|
[ run promise.cpp ]
|
|
[ run promise.cpp : : : $(USE_SELECT) : promise_select ]
|
|
;
|