All pastes #293959 Raw Edit

Someone

public cpp v1 · immutable
#293959 ·published 2006-12-28 01:20 UTC
rendered paste body
#include <vector>#include <boost/bind.hpp>#include <asio.hpp>#include <iostream>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<client> 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<client>::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<client>::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;}