12 Mart 2018 Pazartesi

asio tcp resolver Sınıfı

Giriş
Bu sınıf şöyle kullanılabilir.
tcp::socket socket = ...;
asio::connect (socket, it);
Şöyle kullanılabilir.
socket.async_connect (it->endpoint(),handler);
Constructor
İmzası şöyle
basic_resolver(boost::asio::io_service& io_service);
Şöyle yaparız
asio::io_service ios;
tcp::resolver r (ios);
Move Constructor
Sanırım bu metod deleted. Şöyle yaparsak
m_resolver(tcp::resolver(m_io_service))
Şu hatayı verir.
error: use of deleted function 
boost::asio::ip::basic_resolver<boost::asio::ip::tcp>::basic_resolver
(boost::asio::ip::basic_resolver<boost::asio::ip::tcp>&&)’
async_resolve metodu - query
Örnek
Şöyle yaparız.
std::string url = "www.stackoverflow.com";
tcp::resolver::query q {url, "80"};
r.async_resolve (q, std::bind(resolve_handler, _1, _2, url));
handler şöyledir. Handler'a verilen itereator her zaman valid kalıyor.
void resolve_handler (const boost::system::error_code &ec,
  tcp::resolver::iterator it,const std::string &url) {
  ...  
}
Örnek
async_resolve metodu çağrıldığında resolver nesnesinin yaşıyor olması gerekiyor. Yani stack'te yaratılmamalıdır. Heap'te yaratılan resolver nesnesini lambda ile capture ederek yaşamasını sağlayabiliriz. Şöyle yaparız,
boost::asio::io_service ios = ...;
tcp::resolver::query query("www.google.com", "http");
auto r = std::make_shared<tcp::resolver>(ios);
r->async_resolve(
  query,
  [r](auto ec, auto it) { resolver_handler(ec, it); }
);
resolve metodu - endpoint
Şöyle yaparız
asio::ip::address_v4 ipa = asio::ip::address_v4::from_string ("8.8.8.8");    
asio::ip::tcp::endpoint ep;
ep.address(ipa);
ep.port (80);

asio::io_service ios;
asio::ip::tcp::resolver resolver (ios);
asio::ip::tcp::resolver::iterator destination = resolver.resolve (ep);
resolve metodu - query
Bir iterator döner çünkü resolve işlemi birden fazla sonuç döndürebilir.

Örnek
Şöyle yaparız.
std::string url = "www.stackoverflow.com";
int port = 80;
tcp::resolver::query q (url,port);
tcp::resolver::iterator it = r.resolve (q); 
Örnek
Port yerine servis ismi verilebilir. Şöyle yaparız.
std::string url = "www.stackoverflow.com";
tcp::resolver::query q (url,"daytime");
tcp::resolver::iterator it = r.resolve (q);
Örnek
Şöyle yaparız.
boost::asio::ip::tcp::resolver::query q ("www.baidu.com", "http");
boost::asio::ip::tcp::resolver::iterator iter = resolver.resolve(q);
boost::asio::ip::tcp::resolver::iterator end; 
while (iter != end)
{
  boost::asio::ip::tcp::endpoint endpoint = *iter++;
  std::cout << endpoint << std::endl;
}
Çıktı olarak şunu alırız.
180.97.33.108:80
180.97.33.107:80

Hiç yorum yok:

Yorum Gönder