26 Ekim 2017 Perşembe

asio streambuf'a Direkt Yazma

commit metodu
Açıklaması şöyle. Commit ve prepare beraber kullanılır.
Requires a preceding call prepare(x) where x >= n, and no intervening operations that modify the input or output sequence.
Örnek
Şöyle yaparız.
void direct_insert(asio::streambuf& sb, std::string const& data)
{
  auto size = data.size();
  auto buffer = sb.prepare(size);
  std::copy(begin(data), end(data), asio::buffer_cast<char*>(buffer));
  sb.commit(size);
}
Örnek
Senkron metodlar ile kullanmak için önce bellek ayırırız. Şöyle yaparız.
buf.commit (10);
Sonra şöyle yaparız.
boost::asio::streambuf buf;
// prepare() 512 bytes for the output sequence.  The input sequence
// is empty.
auto bufs = buf.prepare(512);
// Read from the socket, writing into the output sequence.  The
// input sequence is empty and the output sequence contains "hello".
size_t n = sock.receive (bufs);

// Remove 'n' (5) bytes from output sequence appending them to the
// input sequence.  The input sequence contains "hello" and the
// output sequence has 507 bytes.
buf.commit(n);

// The input and output sequence remain unchanged.
std::istream is(&buf);
std::string s;

// Read from the input sequence and consume the read data.  The string
// 's' contains "hello".  The input sequence is empty, the output
// sequence remains unchanged.
is >> s;
Örnek
asenkron metodlar ile kullanmak için şöyle yaparız. Burada prepare() ile önce bellek ayrıldığı varsayılıyor.
void Foo::readHandler(const boost::system::error_code &error,
  std::size_t bytes_transferred)
{
  if(!error)
  {
    buf.commit(bytes_transferred);
    std::istream istrm(&buf);
    std::string message;
    istrm >> message;
    ...
    } else {
        // ...
    }
}
Örnek
Şöyle yaparız. Burada prepare() ile önce bellek ayrıldığı varsayılıyor.
asio::async_read_until(socket, buf, "\n",
  [self = shared_from_this()](auto const&ec, auto size)
  {
    if (size == 0 )
    {
      // error condition
      ...
    }
    else {
      self->buffer.commit(size);
      std::istream is(std::addressof(self->buffer_));
      std::string str;
      while (std::getline(is, str))
      {
        ...
      }
      self->run();
    }
});
Örnek
streambuf nesnesine yazmak için normalde şöyle yaparız. Yani OutputStream haline getiririz.
boost::asio::streambuf buffer;
std::ostream os(&buffer);

uint32_t value = 0x12345678;
os << value; // Gives ascii 305419896

os.write((const char *) &value, sizeof(value)); // fives 0x12345678
Ancak şöyle de yapılabilir. Burada prepare() ile önce bellek ayrıldığı varsayılıyor.
buffer.commit(boost::asio::buffer_copy(
    buffer.prepare(sizeof(value)),
    boost::asio::buffer(&value, sizeof(value))));

Hiç yorum yok:

Yorum Gönder