c++ - Boost asio TCP async server not async? -
c++ - Boost asio TCP async server not async? -
i using code provided in boost example.
the server accepts 1 connection @ time. means, no new connections until current 1 closed.
how create above code take unlimited connections @ same time?
#include <cstdlib> #include <iostream> #include <memory> #include <utility> #include <boost/asio.hpp> using boost::asio::ip::tcp; class session : public std::enable_shared_from_this<session> { public: session(tcp::socket socket) : socket_(std::move(socket)) { } void start() { do_read(); } private: void do_read() { auto self(shared_from_this()); socket_.async_read_some(boost::asio::buffer(data_, max_length), [this, self](boost::system::error_code ec, std::size_t length) { if (!ec) { boost::this_thread::sleep(boost::posix_time::milliseconds(10000));//sleep time do_write(length); } }); } void do_write(std::size_t length) { auto self(shared_from_this()); boost::asio::async_write(socket_, boost::asio::buffer(data_, length), [this, self](boost::system::error_code ec, std::size_t /*length*/) { if (!ec) { do_read(); } }); } tcp::socket socket_; enum { max_length = 1024 }; char data_[max_length]; }; class server { public: server(boost::asio::io_service& io_service, short port) : acceptor_(io_service, tcp::endpoint(tcp::v4(), port)), socket_(io_service) { do_accept(); } private: void do_accept() { acceptor_.async_accept(socket_, [this](boost::system::error_code ec) { if (!ec) { std::make_shared<session>(std::move(socket_))->start(); } do_accept(); }); } tcp::acceptor acceptor_; tcp::socket socket_; }; int main(int argc, char* argv[]) { seek { if (argc != 2) { std::cerr << "usage: async_tcp_echo_server <port>\n"; homecoming 1; } boost::asio::io_service io_service; server s(io_service, std::atoi(argv[1])); io_service.run(); } grab (std::exception& e) { std::cerr << "exception: " << e.what() << "\n"; } homecoming 0; }
as see, programme waits sleep , doesn't grab sec connection in meantime.
you're doing synchronous wait within handler runs on thread serves io_service. makes asio wait invoking handlers new requests.
use deadline_time
wait_async
, or,
void do_read() { auto self(shared_from_this()); socket_.async_read_some(boost::asio::buffer(data_, max_length), [this, self](boost::system::error_code ec, std::size_t length) { if (!ec) { timer_.expires_from_now(boost::posix_time::seconds(1)); timer_.async_wait([this, self, length](boost::system::error_code ec) { if (!ec) do_write(length); }); } }); }
where timer_
field boost::asio::deadline_timer
fellow member of session
as poor-man's solution add together more threads (this means if more requests arrive @ same time there threads handle them, still block until first thread becomes available pick new request)
boost::thread_group tg; (int i=0; < 10; ++i) tg.create_thread([&]{ io_service.run(); }); tg.join_all();
c++ c++11 boost asynchronous
Comments
Post a Comment