#include "common.h"
#include <deque>
typedef std::deque<io_service_ptr> ios_deque;
class connection : public boost::enable_shared_from_this<connection> {
public:
typedef boost::shared_ptr<connection> pointer;
static pointer create(ba::io_service& io_service) {
return pointer(new connection(io_service));
}
ba::ip::tcp::socket& socket() {
return socket_;
}
void start() {
boost::asio::async_read_until(socket_, buf, boost::regex("\r\n\r\n"),
boost::bind(&connection::handle_read, shared_from_this(),
ba::placeholders::error,
ba::placeholders::bytes_transferred));
}
private:
connection(ba::io_service& io_service) : socket_(io_service) {
}
void handle_write(const boost::system::error_code& error,
size_t bytes_transferred) {
}
void handle_read(const boost::system::error_code& error,
size_t bytes_transferred) {
ba::async_write(socket_, ba::buffer(message_),
boost::bind(&connection::handle_write, shared_from_this(),
ba::placeholders::error,
ba::placeholders::bytes_transferred));
}
ba::ip::tcp::socket socket_;
boost::asio::streambuf buf;
static std::string message_;
};
std::string connection::message_="HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n"
"<html><head><title>test</title>"
"</head><body><h1>Test</h1><p>This is a test!</p></body></html>";
class server {
public:
server(const ios_deque& io_services, int port=10001)
: io_services_(io_services),
acceptor_(*io_services.front(),
ba::ip::tcp::endpoint(ba::ip::tcp::v4(), port)) {
start_accept();
}
private:
void start_accept() {
io_services_.push_back(io_services_.front());
io_services_.pop_front();
connection::pointer new_connection = connection::create(*io_services_.front());
acceptor_.async_accept(new_connection->socket(),
boost::bind(&server::handle_accept, this, new_connection,
ba::placeholders::error));
}
void handle_accept(connection::pointer new_connection,
const boost::system::error_code& error) {
if (!error) {
new_connection->start();
start_accept();
}
}
ios_deque io_services_;
ba::ip::tcp::acceptor acceptor_;
};
int main(int argc, char** argv) {
try {
int thread_num=10;
if(argc > 1)
thread_num=boost::lexical_cast<int>(argv[1]);
ios_deque io_services;
std::deque<ba::io_service::work> io_service_work;
boost::thread_group thr_grp;
for (int i = 0; i < thread_num; ++i) {
io_service_ptr ios(new ba::io_service);
io_services.push_back(ios);
io_service_work.push_back(ba::io_service::work(*ios));
thr_grp.create_thread(boost::bind(&ba::io_service::run, ios));
}
server server(io_services);
thr_grp.join_all();
} catch (std::exception& e) {
std::cerr << e.what() << std::endl;
}
return 0;
}