19 Kasım 2017 Pazar

asio async_connect metodu

async_connect metodu
TCP socket için şöyle yaparız.
var iterator = resolver.resolve({adress, port});

asio::async_connect (socket, iterator,handler);
Bazı örneklerde iterator yerine endpoint kullanılıyor. Şöyle yaparız.
asio::async_connect(socket, endpoints,handler);
Örnek 2
Şöyle yaparız.
auto self(shared_from_this());
boost::asio::async_connect(m_socket, endpoint_iter,
  [this, self](boost::system::error_code ec, tcp::resolver::iterator){...}
Handler
İmzası şöyle
void handler(const boost::system::error_code& error, Iterator iterator);
Eğer iterator parametresi ile ilgilenmiyorsak şöyle yaparız.
void OnConnect(const boost::system::error_code& error)
{
  if (!error)
  {           
    ...
  } else
  {
    ...
  }
}
async_connect ve timeout
Örnek
Şöyle yaparız.
struct Service {
  using error_code = boost::system::error_code;

  template<typename AllowTime, typename Cancel>
  void await_operation_ex(AllowTime const& deadline_or_duration, Cancel&& cancel)
  {
    using namespace boost::asio;

    ioservice.reset();
    {
      high_resolution_timer tm(ioservice, deadline_or_duration);
      tm.async_wait([&cancel](error_code ec)
      {
        if (ec != error::operation_aborted)
          std::forward<Cancel>(cancel)();
      });
      ioservice.run_one();
    }
    ioservice.run();
  }

  template<typename AllowTime, typename ServiceObject>
  void await_operation(AllowTime const& deadline_or_duration, ServiceObject& so) {
    return await_operation_ex(deadline_or_duration, [&so]{ so.cancel(); });
  }

  boost::asio::io_service ioservice;
};
Şöyle yaparız.
tcp::socket socket = ...;
...
boost::asio::async_connect(s, ..., ...);
service.await_operation_ex(TIMEOUT, [&]{
  throw std::runtime_error("Error connecting to server: timeout\n");
});
Örnek
Benzer bir çözüm şöyle.

Hiç yorum yok:

Yorum Gönder