28 Ocak 2017 Cumartesi

asio async_read_until metodu

Giriş
Bu metodun tam 4 tane overload edilmiş hali mevcut. Alltaki soketin async_read_some metodunu kullanır. İşlem sonunda delimeter da okunan buffer'a dahildir.

asyn_read_until - socket + streambuf + delimeter + handler
İmzası şöyle
void-or-deduced async_read_until(
    AsyncReadStream & s,
    boost::asio::basic_streambuf< Allocator > & b,
    char delim,
    ReadHandler handler);
Şöyle yaparız.
boost::asio::async_read_until(socket, streamBuf, "\r\n\r\n", read_handler);
read_handler şöyledir
void read_handler (boost::system::error_code ec, std::size_t nr)
{
  ...
  if (ec) {
    ...   
  } else {
    ...
  }
}
read_handler için lambda kullanmak istersek şöyle yaparız.
async_read_until(socket,streamBuf,delim,
  [](const system::e_code& ec, std::size_t bytes_transferred){
    ...
    if (ec != 0) {
      std::cout << ec.message() << " (" << ec.value() << ") " << std::endl;
      return;
    }

    ...
});
async_read_until - socket + streambuf + delimeter + yield
Elimizde bir streambuf  olsun.
boost::asio::streambuf streamBuf;
Şöyle yaparız. Burada yield ne işe yarıyor bilmiyorum
size_t bytes = 0;
bool eof = false;
try {
  bytes = boost::asio::async_read_until(as_stdin, streamBuf, '\n', yield);
} catch(std::exception const& e) {
  std::cerr << "Exception: " << e.what() << "\n";
  bytes = 0;
  eof = true;
}

if (eof) break;
async_read_until - socket + streambuf + delimeter + error_code
Şöyle yaparız.
boost::system::error_code ec;
auto bytes = boost::asio::async_read_until(as_stdin, streamBuf, '\n', yield[ec]);

if (ec) {
  ...
}



Hiç yorum yok:

Yorum Gönder