26 Ekim 2017 Perşembe

asio streambuf Sınıfı

Giriş
Bu sınıf asio::async_read_until ile kolayca kullanılır.
std::string until = ...;
asio::async_read_until(socket,streambu, until, readHandler);
Not
Eğer tcp kullanıyorsak bu sınıf yerine tcp::iostream tercih edilmeli.

Constructor - default
Şöyle yaparız.
boost::asio::streambuf buf;
Constructor - size
Açıklaması şöyle
The constructor for basic_streambuf accepts a size_t argument specifying the maximum of the sum of the sizes of the input sequence and output sequence. During the lifetime of the basic_streambuf object, the following invariant holds:
size() <= max_size()
Any member function that would, if successful, cause the invariant to be violated shall throw an exception of class std::length_error.
Şöyle yaparız.
boost::asio::streambuf buf (1024);
Şöyle yaparız.
boost::asio::streambuf buf (100 * 1024); //Limit memory for headers
commit metodu
asio streambuf'a Direkt Yazma yazısına taşıdım.

consume metodu
asio streambuf'tan Direkt Okuma yazısına taşıdım.

data metodu
Döndürdüğü tip şöyledir.
boost::asio::streambuf::const_buffers_type bufs = buf.data();
Sınıfın içindeki veri şöyle pointer haline getirilir.
const char* pData = asio::buffer_cast<const char*>(buf.data());
Şöyle yaparız.
//buf is a streambuf
const char *pData = boost::asio::buffer_cast<const char *> (buf.data() );
auto sz = buf.size();
Verinin bir kısmını string'e kopyalamak için şöyle yaparız.
// Copy 10 bytes from the input sequence.  
auto data = buf.data();
std::string str(boost::asio::buffers_begin(data),
                boost::asio::buffers_begin(data) + 10);
Verinin tamamını string'e kopyalamak için şöyle yaparız.
boost::asio::streambuf buf;...
std::string target{
  buffers_begin (buf.data()),
  buffers_end   (buf.data())
};
Verinin tamamını string'e kopyalamak için şöyle yaparız.
const auto bufferIterator = boost::asio::buffers_begin(buf.data());
const std::string message (bufferIterator, bufferIterator + bytes_transferred);
buf.consume (bytes_transferred);
Verinin tamamını vector'e kopyalamak için şöyle yaparız.
boost::asio::streambuf buf;
...
std::vector<char> target (buf.size());
buffer_copy (boost::asio::buffer(target), buf.data());
Veriyi socket'ten göndermek için şöyle yaparız.
// Write to server.
streambuf buf;std::ostream output(&buf);output << "mystring";
write (socket, buf.data());
Bir projede HTTP cevabını göndermek için şöyle yaptım.

boost::asio::streambuf  buffer (512);
std::ostream os (&buffer);

os << "HTTP/1.0 200 OK\r\nContent-type: text/html\r\n\r\n";

socket.send (buffer.data ());

in_avail metodu
Şöyle yaparız.
std::streamsize sa = buf.in_avail();
prepare metodu
Sınıf mutable_buffer haline prepare() metoduyla getirilir.Belirtilen büyüklük kadar bellek ayrılır.Bu bellek yazma işlemi için kullanılır.

Şöyle yaparız.
boost::asio::streambuf streambuf;
boost::asio::streambuf::mutable_buffers_type mutableBuffer = streambuf.prepare(5);
Şöyle yaparız.
// Prepare 1024 bytes for the output sequence.
boost::asio::streambuf streambuf;
streambuf.prepare(1024);
Şöyle yaparız.
buf.prepare(buf.max_size())
Şöyle yaparız.
boost::asio::streambuf streamBuffer;
boost::asio::streambuf::mutable_buffers_type mutableBuffer =
      streamBuffer.prepare(max_length);
socket_.async_read_some(boost::asio::buffer(mutableBuffer),...);
size metodu
Şöyle yaparız.
auto bytes = buf.size();
Diğer Notlar

InputStream Haline Getirme
asio streambuf'ı InputStream Haline Getirme yazısına taşıdım.

OutputStream Haline Getirme
asio streambuf'ı OutputStream Haline Getirme yazısına taşıdım.

buffers_begin metodu
Şöyle yaparız.
asio::streambuf buf;
std::ostream(&buf) << "123, 4, 5; 78, 8, 9;\n888, 8, 8;";

auto itBegin = a::buffers_begin(input.data()),
  itEnd = a::buffers_end(input.data());

Hiç yorum yok:

Yorum Gönder