Advertisement
Guest User

Untitled

a guest
Apr 25th, 2019
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.56 KB | None | 0 0
  1. #pragma once
  2.  
  3. #include <boost/asio/ip/tcp.hpp>
  4. #include <boost/asio/buffer.hpp>
  5. #include <boost/asio/spawn.hpp>
  6. using namespace boost::asio;
  7. using namespace boost::system;
  8.  
  9. namespace msocks::utility
  10. {
  11.  
  12. template<typename AsyncBufferedReadStream, typename AsyncWriteStream>
  13. async_result<yield_context, void(error_code, std::string)>::return_type
  14. socket_pair(
  15. AsyncBufferedReadStream& source,
  16. AsyncWriteStream& destination,
  17. io_context& ioc,
  18. mutable_buffer m_buf,
  19. std::function<void(std::size_t)> before_read,
  20. std::function<void(mutable_buffer)> before_write,
  21. yield_context token
  22. )
  23. {
  24. using result_type = async_result<yield_context, void(error_code, std::string)>;
  25. using handler_type = result_type::completion_handler_type;
  26. handler_type handler(token);
  27. result_type result(handler);
  28. spawn(
  29. ioc,
  30. [
  31. &source,
  32. &destination,
  33. &ioc,
  34. m_buf,
  35. before_read(std::move(before_read)),
  36. before_write(std::move(before_write)),
  37. handler
  38. ](yield_context yield) mutable
  39. {
  40. error_code ec;
  41. std::string err_source;
  42. while (true)
  43. {
  44. if (source.in_avail() <= 4096)
  45. {
  46. source.async_fill(yield);
  47. }
  48. auto ready_to_read = std::min(source.in_avail(), m_buf.size());
  49. before_read(ready_to_read);
  50. auto n_read = source.async_read_some(buffer(m_buf,ready_to_read), yield[ec]);
  51. if(ec)
  52. {
  53. source = "source";
  54. break;
  55. }
  56. before_write(buffer(m_buf, n_read));
  57. async_write(destination, buffer(m_buf, n_read), yield[ec]);
  58. if (ec)
  59. {
  60. source = "destination";
  61. break;
  62. }
  63. }
  64. post(ioc, std::bind(handler, ec, err_source));
  65. });
  66. return result.get();
  67. }
  68.  
  69. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement