19 Kasım 2017 Pazar

asio async_write metodu

Giriş
Açıklaması şöyle.
boost::asio::async_write_some may NOT transfer all of the data to the peer. Consider using the async_write function if you need to ensure that all data is written before the asynchronous operation completes.
Sasync_write metodu - stream_descriptor + buffer + handler
Şöyle yaparız.
boost::asio::posix::stream_descriptor out = ...;
asio::async_write(out, boost::asio::buffer(""), handler);
async_write metodu - socket + buffer + handler
std::vector<asio::const_buffers_1> 
Elimizde bir vector olsun
std::vector<std::string> v;
Şöyle yaparız.
std::vector<asio::const_buffers_1> send_buffers;
send_buffers.reserve(v.size());
std::transform(v.begin(), v.end(),
               std::back_inserter(send_buffers),
              [](auto&& str) {
                return asio::buffer(str);
            });
asio::async_write(socket, send_buffers,handler);
char *
Şöyle yaparız.
char *data = ...;
boost::asio::async_write(socket,
  boost::asio::buffer(data, std::strlen(data)),
  handler);
Şöyle yaparız.
char data [512] = ...;
boost::asio::async_write(socket,
  boost::asio::buffer(data, sizeof(data))
  handler);
string
Şöyle yaparız.
std::string cmd = ...;
boost::asio::async_write(socket, boost::asio::buffer(cmd), handler);
Handler
Şöyle yaparız.
void OnWrite (const boost::system::error_code& ec,std::size_t length) {
  if (error) {
    ...
  }
  else {
    ...
  }
}
Lambda kullanılabilir. Şöyle yaparız.

[this, self](boost::system::error_code ec, std::size_t length)
{
  ...
});
Eğer yazmada hata olursa istenilen verinin tamamı gönderilememiş anlamına gelir. Handler içinde socket kapatılır. Şöyle yaparız.
if (ec) {
  socket.shutdown(boost::asio::ip::tcp::socket::shutdown_both);
  socket.close();
  ...
}
else {
  ...
}
Hata olursa verinin tamamı gönderilememiş olsa bile karşı taraf cevap vermiş olabilir. Cevabı okumak için şöyle yaparız.
void OnWrite (
  const boost::system::error_code & ec,
  const std::size_t bytes_transferred)
{
  // The server may close the connection before the HTTP Request finished
  // writing.  In that case, the HTTP Response will be available on the
  // socket.  Only stop the call chain if an error occurred and no data is
  // available.
  if (ec && !socket_->available()) 
  {
    return;
  }

  boost::asio::async_read_until(*socket_, buffer_, "\r\n", ...);
}
Kapatılan socket nesnesi bir listeden silinebilir. Şöyle yaparız.
list.Remove (shared_from_this());

Hiç yorum yok:

Yorum Gönder