2011-11-14 72 views
6

我想创建一个tcp同步服务器。我的主线程将创建侦听端口,并且传入的连接将由线程处理。Boost 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::run(),看到documentation

run()功能块,直到所有的工作已经完成,并且没有 更多的处理程序被分派,或直至io_service一直 停止。

您还没有在io_service中添加任何处理程序,因此无需调用run()。如果使用异步方法(如async_accept()),则需要run()io_service

+0

有一个情况我会需要在同步服务器上使用run()? – Takashi

+0

@高坤没有没有 –

1

,你可能会发现,如果你的typedef升压的东西更容易阅读你的代码

例如

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

这并没有直接的帮助,但它会帮助