Boost Asio和Coroutine2示例

8
在阅读 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作为上面示例所示的最小客户端/服务器实现?

2个回答

10

据我所知,boost.asio仅支持boost.coroutine,而不支持boost.coroutine2。


coroutine2文档中的示例是误导性的。这太糟糕了,如果能够支持它将会非常好。 - dau_sama
3
好的,我会尽力进行翻译。请问需要翻译的内容是"@kiamlaluno to me, it's answering this question"吗? - Danh
@kiamlaluno 如果它不支持,那就意味着没有相关文档。 - Danh
@kiamlaluno 很有讽刺意味,您选择引用了一些不是 Boost 文档,并且它没有记录 Coroutine2 不受支持的内容 :) - sehe
@sehe,我发现还有一些讽刺的地方,比如说如果A不被B支持,那么没有文档会这样说。 - apaderno
显示剩余4条评论

4
这里提供一个使用协程的Boost.Asio服务器示例,可以在这里找到。
在Boost.Coroutine文档中展示的示例缺少使用boost::asio::spawn创建yield_context作为异步处理程序的部分。
通过遵循#include链在<boost/asio/spawn.hpp>中,似乎仅包括Boost.Coroutine v1。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接