#include #include #include #include namespace fc { namespace asio { namespace detail { void read_write_handler( const promise::ptr& p, const boost::system::error_code& ec, size_t bytes_transferred ) { if( !ec ) p->set_value(bytes_transferred); else p->set_exception( fc::copy_exception( boost::system::system_error(ec) ) ); } void read_write_handler_ec( promise* p, boost::system::error_code* oec, const boost::system::error_code& ec, size_t bytes_transferred ) { p->set_value(bytes_transferred); *oec = ec; } void error_handler( const promise::ptr& p, const boost::system::error_code& ec ) { p->set_value(ec); } void error_handler_ec( promise* p, const boost::system::error_code& ec ) { p->set_value(ec); } template void resolve_handler( const typename promise >::ptr& p, const boost::system::error_code& ec, IteratorType itr) { if( !ec ) { std::vector eps; while( itr != IteratorType() ) { eps.push_back(*itr); ++itr; } p->set_value( eps ); } else { p->set_exception( fc::copy_exception( boost::system::system_error(ec) ) ); } } } boost::asio::io_service& default_io_service() { static boost::asio::io_service* io = new boost::asio::io_service(); static boost::asio::io_service::work the_work(*io); static boost::thread io_t([=] { fc::thread::current().set_name("asio1"); io->run(); }); static boost::thread io_t2([=]{ fc::thread::current().set_name("asio2"); io->run(); }); static boost::thread io_t3([=]{ fc::thread::current().set_name("asio3"); io->run(); }); return *io; } namespace tcp { std::vector resolve( const std::string& hostname, const std::string& port) { resolver res( fc::asio::default_io_service() ); promise >::ptr p( new promise >() ); res.async_resolve( boost::asio::ip::tcp::resolver::query(hostname,port), boost::bind( detail::resolve_handler, p, _1, _2 ) ); return p->wait();; } } namespace udp { std::vector resolve( resolver& r, const std::string& hostname, const std::string& port) { resolver res( fc::asio::default_io_service() ); promise >::ptr p( new promise >() ); res.async_resolve( resolver::query(hostname,port), boost::bind( detail::resolve_handler, p, _1, _2 ) ); return p->wait(); } } } } // namespace fc::asio