22 Mart 2018 Perşembe

asio tcp iostream Sınıfı

Giriş
Şu satırı dahil ederiz.
#include <boost/asio.hpp>
Daha rahat kullanmak için şöyle yaparız.
using boost::asio::ip::tcp;
Bu sınıf aynı bir stream gibi kullanıldığı için tcp socket sınıfına göre kullanması daha kolay olabilir. Bu sınıfta asenkron metodlar yok, zaten amacı da bu.

Constructor
İstemci ise daha sonra connect() çağrısı ile bağlanmak gerekir. Sunucu ise tcp::acceptor ile dinlemek gerekir. Şöyle yaparız.
boost::asio::ip::tcp::iostream ss;
Constructor - İstemci (ip + port)
Şöyle yaparız.
boost::asio::ip::tcp::iostream ss ("127.0.0.1", "3000");
Constructor - İstemci (ip + port)
Şöyle yaparız.
tcp::iostream ss (tcp::resolver::query { "127.0.0.1", "3780" });
Şöyle yaparız.
tcp::iostream ss (tcp::resolver::query{ "127.0.0.1", "6293" });
Constructor - İstemci - (host + string)
Şöyle yaparız
tcp::iostream ss ("localhost", "http");
clear metodu
Şöyle yaparız.
using boost::asio::ip::tcp;

int main() {
  tcp::iostream stream;

  do {
    std::cout << "Connecting...\n";

    stream.clear();
    stream.connect("127.0.0.1", "4444");

    std::this_thread::sleep_for(std::chrono::milliseconds(500));
  } while (!stream);

std::cout << "Connected! " << stream.rdbuf();
close metodu
Şöyle yaparız.
ss.close();
connect metodu
Şöyle yaparız.
stream.connect("127.0.0.1", "4444");
eof metodu
Şöyle yaparız.
if (ss.eof()) {
  cout << "eof" << endl;
  ss.close();
}
expires_from_now metodu
İstemci olarak şöyle yaparız.
boost::asio::ip::tcp::iostream ss;
ss.expires_from_now(boost::posix_time::seconds(60));
ss.connect("ip-api.com", "http");
ss << "GET /xml HTTP/1.0\r\n";
ss << "Host: ip-api.com\r\n";
ss << "Accept: */*\r\n";
ss << "Connection: close\r\n\r\n";
ss.flush();
getline metodu
Şöyle yaparız.
char res[255];
std::stringstream srtss;
while (!ss.eof()) {
  ss.getline(res, 255);
  strss << res << "\n";
}
operator bool metodu
Şöyle yaparız.
if (!ss) {...}
operator << metodu
Örnek
Şöyle yaparız.
ss << ...;
Örnek
Şöyle yaparız
s << "GET / HTTP/1.0\r\n\r\n" << std::flush;
rdbuf metodu
basic_socket_streambuf nesnesini döner. Bu nesne de basic_socket sınıfından kalıttığı için alttaki sockete erişilebilir.

Örnek
Sunucunun cevabını okumak için şöyle yaparız
tcp::iostream ss ("localhost", "http");

ss << "GET / HTTP/1.0\r\n\r\n" << std::flush;
std::cout << ss.rdbuf(); // print response
Örnek - rdbuf()->assign metodu
Daha önceden açılmış bir socketi atamak için şöyle yaparız.
tcp::socket s(svc);
s.connect(tcp::endpoint {{}, 6767});

tcp::iostream stream;
stream.rdbuf()->assign(tcp::v4(), s.native_handle());

std::cout << stream.rdbuf() << std::flush;
Örnek - rdbuf()->socket metodu
Daha önceden açılmış bir socketi atamak için şöyle yaparız.
#include <boost/asio.hpp>

namespace ba = boost::asio;
using ba::ip::tcp;

int main() {
  ba::io_service ios;
  tcp::socket s(ios);

  // e.g. connect to test service
  s.connect({{}, 6767});

  tcp::iostream ss;
  ss.rdbuf()->socket() = std::move(s);

  for (std::string line; getline(stream, line);) {
     std::reverse(line.begin(), line.end());
     stream << line << std::endl;
  }
}
Örnek - *rdbuf()
Şöyle yaparız.
boost::asio::ip::tcp::acceptor acceptor = ...;
boost::asio::ip::tcp::iostream stream;
acceptor.accept(*stream.rdbuf());
Örnek *rdbuf() + error_code
Şöyle yaparız.
tcp::acceptor acceptor = ...;

tcp::iostream ss;
boost::system::error_code ec;
acceptor.accept (*ss.rdbuf(), ec);
Diğer
std::string'e çevirme
Şöyle yaparız
boost::asio::ip::tcp::iostream ss;
ss.expires_from_now(boost::posix_time::seconds(2));
ss.connect("ip-api.com", "80");
ss << "GET /xml HTTP/1.0\r\n";
ss << "Host: ip-api.com\r\n";
ss << "Accept: */*\r\n";
ss << "Connection: close\r\n\r\n";
ss.flush();

std::string const response(std::istreambuf_iterator<char>(ss), {});
filtering_ostream ile kullanımı
Veriyi sıkıştırarak göndermek için şöyle yaparız.
tcp::iostream ss = ...;

boost::iostreams::filtering_ostream out;
out.push (boost::iostreams::zlib_compressor());
out.push (ss);

std::ifstream ifs("main.cpp", std::ios::binary);
out << ifs.rdbuf();
out.flush();
filtering_istream ile kullanımı
Veriyi açarak göndermek için şöyle yaparız.
tcp::iostream ss = ...;
            
boost::iostreams::filtering_istream in;
in.push (boost::iostreams::zlib_decompressor());
in.push (ss);

std::ofstream ofs ("main.cpp" , std::ios::binary);
boost::iostreams::copy (in, ofs);

Hiç yorum yok:

Yorum Gönder