#include #include #include #include using asio::ip::tcp; class client { private: tcp::socket socket_; public: client(asio::io_service& io_service) : socket_(io_service) {} tcp::socket& socket() { return socket_; } }; class server { private: asio::io_service& io_service_; tcp::acceptor acceptor_; std::vector clients; asio::streambuf buffer; public: server(asio::io_service& io_service, short port) : io_service_(io_service), acceptor_(io_service, tcp::endpoint(tcp::v4(), port)) { client* new_client = new client(io_service_); acceptor_.async_accept(new_client->socket(), boost::bind(&server::handle_accept, this, new_client, asio::placeholders::error)); } void handle_accept(client* new_client, const asio::error& error) { if (!error) { clients.push_back(*new_client); // asio::async_read_until(new_client->socket(), buffer, '\n', &server::handle_read); asio::async_read_until(new_client->socket(), buffer, '\n', boost::bind(&server::handle_read, this, asio::placeholders::error, asio::placeholders::bytes_transferred)); client* new_client = new client(io_service_); acceptor_.async_accept(new_client->socket(), boost::bind(&server::handle_accept, this, new_client, asio::placeholders::error)); } else { delete new_client; } } void handle_read(const asio::error& error, std::size_t size) { if (!error) { std::istream is(&buffer); std::string line; std::getline(is, line); std::vector::iterator i; for (i=clients.begin(); i != clients.end(); ++i) { asio::async_write(i->socket(), asio::buffer(line.c_str(), line.size()), boost::bind(&server::handle_write, this, asio::placeholders::error, asio::placeholders::bytes_transferred)); } } } void handle_write(const asio::error& error, std::size_t bytes_transferred) { if (!error) { std::vector::iterator i; for (i=clients.begin(); i != clients.end(); ++i) { asio::async_read_until(i->socket(), buffer, '\n', boost::bind(&server::handle_read, this, asio::placeholders::error, asio::placeholders::bytes_transferred)); } } } }; int main(int argc, char* argv[]) { try { asio::io_service io_service; server s(io_service, 1337); io_service.run(); } catch (asio::error& e) { std::cerr << e << "\n"; } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << "\n"; } return 0; }