2011-11-14 20 views
6

Estoy tratando de crear un servidor síncrono tcp. Mi hilo principal crearía escuchar un puerto, y una conexión entrante sería manejada por un hilo.Boost Asio multiproceso TCP Servidor síncrono

Mi código:

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

} 

El siguiente es trabajar con más de un cliente que se conecta al servidor; sin embargo, también funciona si elimino el grupo de subprocesos. ¿Alguien puede explicarme por qué es eso? ¿Incluso necesito un grupo de hilos?

Respuesta

6

sin embargo, también funciona si elimino el conjunto de hilos. ¿Puede alguien explicarme por qué es así? ¿Incluso necesito un grupo de hilos?

No necesita un conjunto de hilos dado el código de muestra. No hay necesidad de invocar io_service::run() en su contexto, ver las documentation

Los run() bloques de función hasta que todo el trabajo ha terminado y no hay manipuladores más para ser despachados, o hasta que el io_service ha sido se detuvo.

No se han añadido a la manipuladores io_service lo que no hay necesidad de invocar run(). Si utiliza métodos asíncronos como async_accept(), necesitará run()io_service.

+0

es que hay una situación en la que sería ¿Necesita usar run() en un servidor síncrono? – Takashi

+0

@ Takashi-kun no, no hay –

1

puede que le resulte más fácil de leer su código si typedef la materia impulso

ejemplo

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

Esto no ayuda directamente, sino que ayudará a

Cuestiones relacionadas