2016-08-17 19 views
5

coroutine2のドキュメントを読んでいる間、私は、コードの素敵なsnippetが見つかりました:ブーストASIOとcoroutine2例

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

私の知る限りのboost.asioのみboost.coroutineをサポートし、コルーチンを使用して

+0

coroutine2のマニュアルの例は誤解を招きます。それはあまりにも悪いです、それをサポートすることは素晴らしいことです。 –

+0

これは質問に対する答えを提供しません。批評をしたり、著者の説明を求めるには、投稿の下にコメントを残してください。 - [レビューの投稿](レビュー/低品質の投稿/ 14285746) – kiamlaluno

+3

@kiamlalunoは私にこの質問に答えています – Danh

3

に例をboost.coroutine2ないBoost.Asioベースのサーバーはhereを与えています。

Boost.Coroutineのドキュメントに表示されている例には、boost::asio::spawnを使用してyield_contextを作成して非同期ハンドラとして渡すことができる部分がありません。

のチェーンを<boost/asio/spawn.hpp>にすると、Boost.Coroutine v1のみが含まれているようです。

関連する問題