C:/Development/boost_sandbox/rpc/boost/rpc/simple_acceptor.hpp

00001 #ifndef BOOST_RPC_SIMPLE_ACCEPTOR
00002 #define BOOST_RPC_SIMPLE_ACCEPTOR
00003 
00004 #include <boost/asio.hpp>
00005 #include <boost/bind.hpp>
00006 
00007 namespace boost {
00008 namespace rpc {
00009 
00011 
00013 class simple_acceptor
00014 {
00015 public:
00016     simple_acceptor(boost::asio::io_service& io_service, int port_number,
00017         boost::function<void (std::auto_ptr<boost::asio::ip::tcp::socket>)> callback)
00018         : acceptor_(io_service, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), port_number))
00019         , connected(callback)
00020     {
00021         start_accept();
00022     }
00023     ~simple_acceptor()
00024     {
00025         delete socket_ptr;
00026     }
00027 private:
00028     void start_accept()
00029     {
00030         socket_ptr = new boost::asio::ip::tcp::socket(acceptor_.io_service());
00031         acceptor_.async_accept(*socket_ptr,
00032             boost::bind(&simple_acceptor::handle_accept, this,
00033             boost::asio::placeholders::error));
00034     }
00035 
00036     void handle_accept(const boost::system::error_code& error)
00037     {
00038         if (!error)
00039         {
00040             connected(std::auto_ptr<boost::asio::ip::tcp::socket> (socket_ptr));
00041             start_accept();
00042         }
00043     }
00044 
00045     boost::asio::ip::tcp::socket * socket_ptr;
00046     boost::asio::ip::tcp::acceptor acceptor_;
00047     boost::function<void (std::auto_ptr<boost::asio::ip::tcp::socket>)> connected;
00048 };
00049 
00050 } // namespace rpc
00051 } // namespace boost
00052 
00053 #endif // BOOST_RPC_SIMPLE_ACCEPTOR

Generated on Sun May 20 15:47:56 2007 by  doxygen 1.5.2