Archive / / / / network.h
2007-09-22 17:00:33 UTC
previous next
#ifndef NETWORK_H_ #define NETWORK_H_ #include <boost/thread.hpp> #include <boost/utility.hpp> #include <boost/asio.hpp> #include <boost/shared_ptr.hpp> #include <boost/enable_shared_from_this.hpp> #include <list> namespace Network { class Connection; class Manager : private boost::noncopyable { public: // Public methods, called from outside the thread ~Manager(); void start_listener(); void end_connection( boost::shared_ptr<Connection> connection); private: // Private methods, called from outside the thread Manager(); // Constructor is private to control who can create objects private: // Private methods, called from inside the thread void start(); void start_listener_int(); void end_connection_int( boost::shared_ptr<Connection> connection); private: // Private data boost::scoped_ptr<boost::thread> _thread; boost::asio::io_service _io_service; boost::scoped_ptr<boost::asio::io_service::work> _io_service_work; std::list<boost::shared_ptr<Connection> > _connections; static boost::scoped_ptr<Manager> _instance; public: friend Manager& manager(); friend int main (int argc, char *argv[]); // To initialize the instance static void create() { _instance.reset(new Manager()); } static void destroy() { _instance.reset(); } }; Manager& manager(); class Connection : private boost::noncopyable, public boost::enable_shared_from_this<Connection> { public: Connection(Manager& manager); ~Connection(); void start_listening(); void accept_connection( const boost::asio::error& error); void receive_data( const boost::asio::error& error, std::size_t bytes_transferred); private: boost::scoped_ptr<boost::thread> _thread; boost::asio::io_service _io_service; boost::scoped_ptr<boost::asio::io_service::work> _io_service_work; boost::asio::ip::tcp::socket _socket; boost::scoped_ptr<boost::asio::ip::tcp::acceptor> _acceptor; boost::array<unsigned char, 2048> _buffer; Manager& _manager; }; //extern boost::scoped_ptr<Manager> manager; } #endif /*NETWORK_H_*/