2011-11-14 20 views
6

tcp同期サーバーを作成しようとしています。私の主なスレッドはポートを聞いて作成し、着信接続はスレッドによって処理されます。ブーストAsioマルチスレッドTCP同期サーバー

マイコード:

void WorkerThread(boost::shared_ptr<boost::asio::io_service> io_service) 
{ 
    io_service->run(); 
} 

void Application::server() 
{ 
     boost::shared_ptr<boost::asio::io_service> io(
      new boost::asio::io_service() 
      ); 
     boost::shared_ptr<boost::asio::io_service::work> work(
      new boost::asio::io_service::work(*io) 
      ); 
     // Open the acceptor with the option to reuse the address (i.e. SO_REUSEADDR 
     boost::asio::ip::tcp::acceptor acceptor(*io); 
     boost::asio::ip::tcp::endpoint endpoint(boost::asio::ip::tcp::v4(), 2198); 
     acceptor.open(endpoint.protocol()); 
     acceptor.set_option(boost::asio::ip::tcp::acceptor::reuse_address(true)); 
     acceptor.bind(endpoint); 
     acceptor.listen();    

     // pool of threads 
     boost::thread_group worker_threads; 
     for(int x = 0; x < 5; ++x) 
     { 
      worker_threads.create_thread(boost::bind(&WorkerThread, io)); 
     } 

     while(true) 
     { 
      boost::shared_ptr<boost::asio::ip::tcp::socket> socket(
       new boost::asio::ip::tcp::socket(*io) 
       ); 
      acceptor.accept(*socket); 
      processConnection(*socket); 
      socket->close(); 
     } 

     io->stop(); 
     worker_threads.join_all(); 

} 

void Application::processConnection(boost::asio::ip::tcp::socket & socket) 
{ 
    boost::asio::streambuf request_buffer; 
    std::istream request_stream(&request_buffer); 
    // repsonse buffer 
    boost::asio::streambuf response_buffer; 
    std::ostream response_stream(&response_buffer); 
    boost::asio::read_until(socket, request_buffer, "</message>"); 

    // process request_buffer into response_buffer 

    boost::asio::write(socket, response_buffer); 

} 

複数のクライアントがサーバに接続して作業している以下。しかし、私はスレッドのプールを削除しても動作します。誰でも私がなぜそれを説明できますか?スレッドプールが必要なのでしょうか?

答えて

6

ただし、スレッドプールを削除しても機能します。誰でも 私はなぜそれを説明することができますか?スレッドプールが必要なのでしょうか?

サンプルコードでは、スレッドのプールは必要ありません。すべての作業が終了したと派遣すべき より多くのハンドラが存在しない、またはio_serviceは が停止されるまでまでdocumentation

run()機能ブロックを参照してください、あなたのコンテキストでio_service::run()を起動する必要はありません。

io_serviceにハンドラを追加していないので、run()を呼び出す必要はありません。 async_accept()などの非同期メソッドを使用する場合は、のrun()が必要です。

+0

を助ける

typedef boost::asio::ip::tcp::socket TSocket; 

同期サーバーでrun()を使用する必要がありますか? – Takashi

+0

@タカシくんない –

1

あなたは、ブーストのものにtypedefの場合、それは簡単にあなたのコードを読むことを見つけるかもしれない

例事態がどこ私は考えているこれは直接助けにはならないが、それは

関連する問題