मैं एक टीसीपी सिंक्रोनस सर्वर बनाने की कोशिश कर रहा हूं। मेरा मुख्य धागा एक बंदरगाह को सुन देगा, और एक आने वाले कनेक्शन को थ्रेड द्वारा संभाला जाएगा।बूस्ट एएसओ मल्टीथ्रेडेड टीसीपी सिंक्रोनस सर्वर
मेरे कोड:
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);
}
निम्नलिखित एक से अधिक ग्राहकों सर्वर से कनेक्ट के साथ काम कर रहा है; हालांकि, अगर मैं थ्रेड के पूल को हटा देता हूं तो यह भी काम करता है। क्या कोई मुझे समझा सकता है कि वह क्यों है? क्या मुझे धागे के पूल की भी आवश्यकता है?
में मदद मिलेगी वहाँ मैं कहाँ हैं एक स्थिति है एक सिंक्रोनस सर्वर पर रन() का उपयोग करने की आवश्यकता है? – Takashi
@ ताकाशी-कुन नहीं है –