2008-02-04

boost::asio TCP resolver

한가로운 주말, 최신 BOOST 를 vc81로 빌드하고 ASIO를 만지작거려 봤다. 대충 훑어본 바, 이 정도면 지금 코드에서 충분히 ACE를 제거해도 될 수준의 기능인 듯하다. 어차피 둘 다 디버깅 들어가면 템플릿 사이에서 헤매이는 건 마찬가지니...


// TODO multiple ip address in localmachine (..localmachine)
BOOST_AUTO_TEST_CASE( test_resolver )
{
 boost::asio::io_service io_service;
 boost::system::error_code error;
 tcp::resolver resolver(io_service);
 tcp::resolver::iterator end_;

 // localmachine
 {
  tcp::resolver::query query(boost::asio::ip::host_name(),"");
  tcp::resolver::iterator iterator = resolver.resolve(query);
  tcp::endpoint _endpoint = *iterator;
  BOOST_CHECK_EQUAL( _endpoint.address().to_string(), "192.168.10.101" );
 }

 // host -> ip
 {
  tcp::resolver::query query("reiot.cafe24.com","");
  tcp::resolver::iterator iterator = resolver.resolve(query);
  tcp::endpoint _endpoint = *iterator;
  BOOST_CHECK_EQUAL( _endpoint.address().to_string(), "123.214.172.49" );
 }

 // localhost
 {
  tcp::resolver::query query("localhost","");
  tcp::resolver::iterator iterator = resolver.resolve(query);
  tcp::endpoint _endpoint = *iterator;
  BOOST_CHECK_EQUAL( _endpoint.address().to_string(), "127.0.0.1" );
  if ( ++iterator != end_ )
  {
   _endpoint = *iterator;
   BOOST_CHECK_EQUAL( _endpoint.address().to_string(), "192.168.10.101" );
  }
 }

 // http
 {
  tcp::resolver::query query("reiot.cafe24.com","http");
  tcp::resolver::iterator iterator = resolver.resolve(query);
  tcp::endpoint _endpoint = *iterator;
  BOOST_CHECK_EQUAL( _endpoint.address().to_string(), "123.214.172.49" );
  BOOST_CHECK_EQUAL( _endpoint.port(), 80 );
 }

 // ftp
 {
  tcp::resolver::query query("reiot.cafe24.com","ftp");
  tcp::resolver::iterator iterator = resolver.resolve(query);
  tcp::endpoint _endpoint = *iterator;
  BOOST_CHECK_EQUAL( _endpoint.address().to_string(), "123.214.172.49" );
  BOOST_CHECK_EQUAL( _endpoint.port(), 21 );
 }

 // telnet
 {
  tcp::resolver::query query("reiot.cafe24.com","telnet");
  tcp::resolver::iterator iterator = resolver.resolve(query);
  tcp::endpoint _endpoint = *iterator;
  BOOST_CHECK_EQUAL( _endpoint.address().to_string(), "123.214.172.49" );
  BOOST_CHECK_EQUAL( _endpoint.port(), 23 );
 }

 // unknown host
 {
  tcp::resolver::query query("reiot1.com","");
  resolver.resolve(query,error);
  BOOST_CHECK_EQUAL( error.value(), boost::asio::error::host_not_found );
 }

 // unknown service
 {
  tcp::resolver::query query("reiot.cafe24.com","test");
  resolver.resolve(query,error);
  BOOST_CHECK_EQUAL( error.value(), boost::asio::error::service_not_found );
 }
}

void print_address(const boost::system::error_code& e, tcp::resolver::iterator itr )
{
 tcp::endpoint endpoint_ = *itr;
 BOOST_MESSAGE( endpoint_.address() );
}

class AsyncResolveHandler
{
public :
 AsyncResolveHandler( int errorcode ) : address_(""), port_(0), errorcode_(errorcode) {}
 AsyncResolveHandler( std::string addr, int port = 0 ) : address_(addr), port_(port) {}
 void operator() (const boost::system::error_code& e, tcp::resolver::iterator itr )
 {
  if ( !e )
  {
   tcp::endpoint endpoint_ = *itr;
   BOOST_CHECK_EQUAL( endpoint_.address().to_string(), address_ );
   if ( port_ != 0 )
   {
    BOOST_CHECK_EQUAL( endpoint_.port(), port_ );
   }
  }
  else
  {
   BOOST_CHECK_EQUAL( e.value(), errorcode_ );
  }
 }
 std::string address_;
 int port_;
 int errorcode_;
};

BOOST_AUTO_TEST_CASE( test_async_resolver )
{
 boost::asio::io_service io_service;

 tcp::resolver resolver(io_service);

 boost::system::error_code error;

 // host -> ip
 {
  tcp::resolver::query query("reiot.cafe24.com","");
  resolver.async_resolve(query,AsyncResolveHandler("123.214.172.49"));
  BOOST_CHECK_EQUAL(io_service.run_one(error),1);
  BOOST_CHECK_MESSAGE(!error,error.message());
  io_service.reset();
 }

 // localhost -> 127.0.0.1
 {
  tcp::resolver::query query("localhost","");
  resolver.async_resolve(query,AsyncResolveHandler("127.0.0.1"));
  BOOST_CHECK_EQUAL(io_service.run_one(error),1);
  BOOST_CHECK_MESSAGE(!error,error.message());
  io_service.reset();
 }

 // http
 {
  tcp::resolver::query query("reiot.cafe24.com","http");
  resolver.async_resolve(query,AsyncResolveHandler("123.214.172.49",80));
  BOOST_CHECK_EQUAL(io_service.run_one(error),1);
  BOOST_CHECK_MESSAGE(!error,error.message());
  io_service.reset();

 }

 // ftp
 {
  tcp::resolver::query query("reiot.cafe24.com","ftp");
  resolver.async_resolve(query,AsyncResolveHandler("123.214.172.49",21));
  BOOST_CHECK_EQUAL(io_service.run_one(error),1);
  BOOST_CHECK_MESSAGE(!error,error.message());
  io_service.reset();
 }

 // telnet
 {
  tcp::resolver::query query("reiot.cafe24.com","telnet");
  resolver.async_resolve(query,AsyncResolveHandler("123.214.172.49",23));
  BOOST_CHECK_EQUAL(io_service.run_one(error),1);
  BOOST_CHECK_MESSAGE(!error,error.message());
  io_service.reset();
 }

 // unknown host
 {
  tcp::resolver::query query("reiot1.com","");
  resolver.async_resolve(query,AsyncResolveHandler(boost::asio::error::host_not_found));
  BOOST_CHECK_EQUAL(io_service.run_one(error),1);
  BOOST_CHECK_MESSAGE(!error,error.message());
  io_service.reset();
 }

 // unknown service
 {
  tcp::resolver::query query("reiot.cafe24.com","test");
  resolver.async_resolve(query,AsyncResolveHandler(boost::asio::error::service_not_found));
  BOOST_CHECK_EQUAL(io_service.run_one(error),1);
  BOOST_CHECK_MESSAGE(!error,error.message());
  io_service.reset();
 }
}


comments powered by Disqus