Пример использования Asio и Coroutine2

Во время чтения документации coroutine2 Я нашел хороший отрывок кода, который показывает, как использовать его с asio

Для справки вот код из документации:

void session(boost::asio::io_service& io_service){
// construct TCP-socket from io_service
boost::asio::ip::tcp::socket socket(io_service);

try{
for(;;){
// local data-buffer
char data[max_length];

boost::system::error_code ec;

// read asynchronous data from socket
// execution context will be suspended until
// some bytes are read from socket
std::size_t length=socket.async_read_some(
boost::asio::buffer(data),
boost::asio::yield[ec]);
if (ec==boost::asio::error::eof)
break; //connection closed cleanly by peer
else if(ec)
throw boost::system::system_error(ec); //some other error

// write some bytes asynchronously
boost::asio::async_write(
socket,
boost::asio::buffer(data,length),
boost::asio::yield[ec]);
if (ec==boost::asio::error::eof)
break; //connection closed cleanly by peer
else if(ec)
throw boost::system::system_error(ec); //some other error
}
} catch(std::exception const& e){
std::cerr<<"Exception: "<<e.what()<<"\n";
}
}

Однако я не могу найти рабочий пример в документации asio, и попытка скомпилировать этот фрагмент на coliru дает мне ошибки компилятора, связанные с yield

Знаете ли вы о минимальной клиент-серверной реализации, которая использует coroutine2 как показано в примере выше?

6

Решение

AFAIK boost.asio поддерживает только boost.coroutine, но не boost.coroutine2

6

Другие решения

Приведен пример сервера на основе Boost.Asio с использованием сопрограмм. Вот.

В примере, показанном в документации Boost.Coroutine, отсутствует та часть, где boost::asio::spawn используется для создания yield_context это может быть передано как асинхронный обработчик.

Следуя #include цепь внутри <boost/asio/spawn.hpp>, кажется, включает только Boost.Coroutine v1.

4