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();
}
}