2011-11-14 17 views
6

मैं एक टीसीपी सिंक्रोनस सर्वर बनाने की कोशिश कर रहा हूं। मेरा मुख्य धागा एक बंदरगाह को सुन देगा, और एक आने वाले कनेक्शन को थ्रेड द्वारा संभाला जाएगा।बूस्ट एएसओ मल्टीथ्रेडेड टीसीपी सिंक्रोनस सर्वर

मेरे कोड:

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

में मदद मिलेगी वहाँ मैं कहाँ हैं एक स्थिति है एक सिंक्रोनस सर्वर पर रन() का उपयोग करने की आवश्यकता है? – Takashi

+0

@ ताकाशी-कुन नहीं है –

1

आप आप को बढ़ावा देने सामान typedef अगर यह आसान अपने कोड को पढ़ने के लिए मिल सकती है

उदाहरण

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

यह सीधे मदद नहीं करता है, लेकिन यह

संबंधित मुद्दे