#include #include #include #include "yield.hpp" using asio::async_write; using asio::buffer; using asio::ip::tcp; using asio::error_code; using std::size_t; struct session : coroutine { boost::shared_ptr socket_; boost::shared_ptr> buffer_; session(boost::shared_ptr socket) : socket_(socket), buffer_(new std::vector(1024)) { } void operator()(error_code ec = error_code(), size_t n = 0); }; struct server : coroutine { asio::io_service& io_service_; boost::shared_ptr acceptor_; boost::shared_ptr socket_; server(asio::io_service& io_service) : io_service_(io_service), acceptor_(new tcp::acceptor(io_service, tcp::endpoint(tcp::v4(), 54321))) { } void operator()(error_code ec = error_code()); }; // @[session] void session::operator()(error_code ec, size_t n) // #808080 { // #808080 if (!ec) reenter (this) // #808080 { // #808080 for (;;) // #d00000 { // #d00000 yield socket_->async_read_some(buffer(*buffer_), *this); // #d00000 yield async_write(*socket_, buffer(*buffer_, n), *this); // #d00000 } // #d00000 } // #808080 } // #808080 // @[server] void server::operator()(error_code ec) // #808080 { // #808080 reenter (this) // #808080 { // #808080 for (;;) // #d00000 { // #d00000 socket_.reset(new tcp::socket(io_service_)); // #d00000 yield acceptor_->async_accept(*socket_, *this); // #d00000 io_service_.post(session(socket_)); // @->[session] // #d00000 } // #d00000 } // #808080 } // #808080 int main() { asio::io_service io_service; io_service.post(server(io_service)); io_service.run(); }

AltStyle によって変換されたページ (->オリジナル) /