All pastes #293975 Raw Edit

Untitled

public cpp v1 · immutable
#293975 ·published 2006-12-28 01:41 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', 				boost::bind(&server::handle_read, this, new_client, 					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(client* c, const asio::error& error, std::size_t size)	{		if (!error)	   	{	    	std::istream is(&buffer);	     	std::string line;	     	std::getline(is, line);			line.append("\n");						std::vector<client*>::iterator i;			for (i=clients.begin(); i != clients.end(); ++i) 			{				if (c != *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, *i,						asio::placeholders::error, asio::placeholders::bytes_transferred));			}		}	}};int main(int argc, char* argv[]){	try	{		asio::io_service io_service;		server s(io_service, 1338);		io_service.run();	}  	catch (asio::error& e)  	{    	std::cerr << e << "\n";  	}  	catch (std::exception& e)  	{    	std::cerr << "Exception: " << e.what() << "\n";  	}	return 0;}