2011-11-14 19 views
6

Sto provando a creare un server sincrono tcp. Il mio thread principale avrebbe creato l'ascolto di una porta e una connessione in entrata sarebbe stata gestita da un thread.Boost Asio Server sincrono TCP multithread

Il mio codice:

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); 

} 

Di seguito è lavorare con più di un client che si connette al server; tuttavia, funziona anche se rimuovo il pool di thread. Qualcuno può spiegarmi perché è così? Ho anche bisogno di un pool di thread?

risposta

6

tuttavia, funziona anche se rimuovo il pool di thread. Può qualcuno spiegarmi perché è così? Ho anche bisogno di un pool di thread?

Non è necessario un pool di thread dato il codice di esempio. Non v'è alcun bisogno di invocare io_service::run() nel vostro contesto, vedere i documentation

I run() blocchi funzione fino a quando tutto il lavoro è terminato e non ci sono più gestori per essere spediti, o fino a quando il io_service è stato fermato.

Non hanno aggiunto i gestori al io_service quindi non c'è bisogno di invocare run(). Se si utilizzano metodi asincroni come async_accept(), sarà necessario run() il io_service.

+0

c'è una situazione in cui mi sarebbe bisogno di usare run() su un server sincrono? – Takashi

+0

@ Takashi-kun no non c'è –

1

si potrebbe trovare più facile da leggere il codice se si typedef la roba spinta

esempio

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

Questo non direttamente aiutare ma aiuterà