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 }
00051 }
00052
00053 #endif // BOOST_RPC_SIMPLE_ACCEPTOR