Advertisement
Guest User

Untitled

a guest
Apr 1st, 2020
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.83 KB | None | 0 0
  1. #include "socket.hpp"
  2.  
  3.  
  4. namespace tinyfiber {
  5. namespace tcp {
  6.  
  7. using namespace make_result;
  8.  
  9. Result<Socket> Socket::ConnectTo(const std::string& host, uint16_t port) {
  10.   Socket socket;
  11.   return socket.Connect(host, port);
  12. }
  13.  
  14. Result<Socket> Socket::Connect(const std::string& host, uint16_t port) {
  15.     auto addr = resolver_.resolve(host, std::to_string(port));
  16.     std::cout << "size = " <<  addr.size() << std::endl;
  17.     for (asio::ip::tcp::endpoint ep_iter : addr) {
  18.         Fiber *fiber_ptr = GetCurrentFiber();
  19.         socket_.async_connect(
  20.                 ep_iter,
  21.                 [this, fiber_ptr](const asio::error_code &error) {
  22.                     this->error_code_ = error;
  23.                     std::cout << "yeah" << std::endl;
  24.                     GetCurrentScheduler()->MakeRunnable(fiber_ptr);
  25.                 });
  26.         GetCurrentScheduler()->Wait();
  27.         if (error_code_) {
  28.             std::cout << "oops" << std::endl;
  29.             continue;
  30.         }
  31.         std::cout << "break here" << std::endl;
  32.         break;
  33.     }
  34.  
  35.     if (error_code_)
  36.         return make_result::Fail(error_code_);
  37.  
  38.     return make_result::Ok(std::move(*this));
  39. }
  40.  
  41. Socket::Socket()
  42.     : socket_(*(GetCurrentScheduler()->GetIoContext())),
  43.     resolver_(*(GetCurrentScheduler()->GetIoContext())) {};
  44.  
  45. Result<Socket> Socket::ConnectToLocal(uint16_t port) {
  46.     std::string local_host = "localhost";
  47.     return ConnectTo(local_host, port);
  48. }
  49.  
  50. Result<size_t> Socket::ReadSome(MutableBuffer buffer) {
  51.     Fiber* fiber_ptr = GetCurrentFiber();
  52.     socket_.async_read_some(
  53.             asio::buffer(buffer, kBufCapacity),
  54.             [this, fiber_ptr](const asio::error_code& error, std::size_t bytes_read) {
  55.                 this->error_code_ = error;
  56.                 this->bytes_transferred_ = bytes_read;
  57.                 GetCurrentScheduler()->MakeRunnable(fiber_ptr);
  58.             });
  59.  
  60.     GetCurrentScheduler()->Wait();
  61.     if (error_code_) {
  62.         make_result::Fail(this->error_code_);
  63.     }
  64.  
  65.   return Ok<std::size_t>(bytes_transferred_);
  66. }
  67.  
  68. Result<size_t> Socket::Read(MutableBuffer buffer) {
  69.     std::size_t size_buf = buffer.size();
  70.     std::size_t read_bytes = 0;
  71.  
  72.     while (read_bytes != size_buf) {
  73.         read_bytes += ReadSome(buffer);
  74.     }
  75.  
  76.  
  77.     if (error_code_) {
  78.         return make_result::Fail(error_code_);
  79.     }
  80.  
  81.     return make_result::Ok(read_bytes);
  82. }
  83.  
  84. Status Socket::Write(ConstBuffer buffer) {
  85.     Fiber* fiber_ptr = GetCurrentFiber();
  86.     socket_.async_write_some(
  87.             asio::buffer(buffer, kBufCapacity),
  88.             [this, fiber_ptr](const asio::error_code& error, size_t bytes_transferred) {
  89.                 this->error_code_ = error;
  90.                 std::cout << "HEY" << std::endl;
  91.                 GetCurrentScheduler()->MakeRunnable(fiber_ptr);
  92.             });
  93.     GetCurrentScheduler()->Wait();
  94.  
  95.     return make_result::ToStatus(error_code_);
  96. }
  97.  
  98. Status Socket::ShutdownWrite() {
  99.   socket_.shutdown(asio::ip::tcp::socket::shutdown_send, error_code_);
  100.   return make_result::ToStatus(error_code_);
  101. }
  102.  
  103. Acceptor::Acceptor() : acceptor_(*(GetCurrentScheduler()->GetIoContext())) {};
  104.  
  105. Status Acceptor::Listen(uint16_t port) {
  106.     asio::ip::tcp::endpoint end_point(asio::ip::tcp::v4(), port);
  107.  
  108.     acceptor_.open(end_point.protocol(), error_code_);
  109.     acceptor_.bind(end_point, error_code_);
  110.     acceptor_.listen();
  111.     return make_result::ToStatus(error_code_);
  112. }
  113.  
  114. Result<uint16_t> Acceptor::ListenAvailablePort() {
  115.     Status st = Acceptor::Listen(0);
  116.     if (!st) {
  117.         return make_result::Fail(error_code_);
  118.     }
  119.  
  120.     return make_result::Ok(GetPort());
  121. }
  122.  
  123. Result<Socket> Acceptor::Accept() {
  124.     Fiber* fiber_ptr = GetCurrentFiber();
  125.     acceptor_.async_accept(
  126.             [this, fiber_ptr](std::error_code error, asio::ip::tcp::socket) {
  127.                 this->error_code_ = error;
  128.                 std::cout << "y" << std::endl;
  129.                 GetCurrentScheduler()->MakeRunnable(fiber_ptr);
  130.             });
  131.     GetCurrentScheduler()->Wait();
  132.  
  133.     if (error_code_) {
  134.         return make_result::Fail(error_code_);
  135.     }
  136.     return make_result::Ok(std::move(Socket::ConnectToLocal(GetPort())));
  137. }
  138.  
  139. uint16_t Acceptor::GetPort() const {
  140.     return acceptor_.local_endpoint().port();
  141. }
  142.  
  143. }  // namespace tcp
  144. }  // namespace tinyfiber
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement