2016-08-17 178 views
5

在阅读的coroutine2的文档,我发现的代码演示了如何使用asio升压ASIO和coroutine2例如

用它来这里引用一个不错的snippet是从文档代码:

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的最小客户端/服务器实现?

回答

5

AFAIK Boost.Asio的仅支持boost.coroutine,不boost.coroutine2

+0

然后,coroutine2文档中的示例会产生误导。这太糟糕了,支持它会很棒。 –

+0

这不提供问题的答案。要批评或要求作者澄清,请在其帖子下方留言。 - [来自评论](/ review/low-quality-posts/14285746) – kiamlaluno

+3

@kiamlaluno对我来说,它是回答这个问题的 – Danh

3

一个例子Boost.Asio的基于使用协同程序服务器给出here

Boost.Coroutine文档中显示的示例缺少使用boost::asio::spawn创建可作为异步处理程序传递的yield_context的部分。

通过关注<boost/asio/spawn.hpp>中的#include链,它似乎只包含Boost.Coroutine v1。