acceptor.hpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. //
  2. // Copyright (c) 2025 Klemens Morgenstern (klemens.morgenstern@gmx.net)
  3. //
  4. // Distributed under the Boost Software License, Version 1.0. (See accompanying
  5. // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  6. //
  7. #ifndef BOOST_COBALT_EXPERIMENTAL_IO_ACCEPTOR_HPP
  8. #define BOOST_COBALT_EXPERIMENTAL_IO_ACCEPTOR_HPP
  9. #include <boost/cobalt/io/detail/config.hpp>
  10. #include <boost/cobalt/io/ops.hpp>
  11. #include <boost/cobalt/io/stream_socket.hpp>
  12. #include <boost/cobalt/io/seq_packet_socket.hpp>
  13. #include <boost/asio/basic_socket_acceptor.hpp>
  14. namespace boost::cobalt::io
  15. {
  16. struct BOOST_SYMBOL_VISIBLE acceptor
  17. {
  18. using wait_type = asio::socket_base::wait_type;
  19. constexpr static std::size_t max_listen_connections = asio::socket_base::max_listen_connections;
  20. BOOST_COBALT_IO_DECL acceptor(const cobalt::executor & executor = this_thread::get_executor());
  21. BOOST_COBALT_IO_DECL acceptor(endpoint ep, const cobalt::executor & executor = this_thread::get_executor());
  22. BOOST_COBALT_IO_DECL system::result<void> bind(endpoint ep);
  23. BOOST_COBALT_IO_DECL system::result<void> listen(int backlog = max_listen_connections); // int backlog = net::max_backlog()
  24. BOOST_COBALT_IO_DECL endpoint local_endpoint();
  25. private:
  26. struct BOOST_COBALT_IO_DECL accept_op final : op<system::error_code>
  27. {
  28. void initiate(completion_handler<system::error_code> h) override;
  29. accept_op(accept_op &&) noexcept = default;
  30. accept_op(asio::basic_socket_acceptor<protocol_type, executor> & acceptor, socket& sock)
  31. : acceptor_(acceptor), sock_(sock) {}
  32. ~accept_op() = default;
  33. protected:
  34. asio::basic_socket_acceptor<protocol_type, executor> &acceptor_;
  35. socket & sock_;
  36. };
  37. struct BOOST_COBALT_IO_DECL accept_stream_op final : op<system::error_code, stream_socket>
  38. {
  39. void initiate(completion_handler<system::error_code, stream_socket> h) override;
  40. accept_stream_op(accept_stream_op &&) noexcept = default;
  41. accept_stream_op(asio::basic_socket_acceptor<protocol_type, executor> & acceptor) : acceptor_(acceptor) {}
  42. ~accept_stream_op() = default;
  43. private:
  44. asio::basic_socket_acceptor<protocol_type, executor> &acceptor_;
  45. stream_socket sock_{acceptor_.get_executor()};
  46. };
  47. struct BOOST_COBALT_IO_DECL accept_seq_packet_op final : op<system::error_code, seq_packet_socket>
  48. {
  49. void initiate(completion_handler<system::error_code, seq_packet_socket> h) override;
  50. accept_seq_packet_op(accept_seq_packet_op &&) noexcept = default;
  51. accept_seq_packet_op(asio::basic_socket_acceptor<protocol_type, executor> & acceptor) : acceptor_(acceptor) {}
  52. ~accept_seq_packet_op() = default;
  53. private:
  54. asio::basic_socket_acceptor<protocol_type, executor> &acceptor_;
  55. seq_packet_socket sock_{acceptor_.get_executor()};
  56. };
  57. struct BOOST_COBALT_IO_DECL wait_op final : op<system::error_code>
  58. {
  59. void initiate(completion_handler<system::error_code> h) override;
  60. wait_op(asio::basic_socket_acceptor<protocol_type, executor> & acceptor, wait_type wt)
  61. : acceptor_(acceptor), wt_(wt) {}
  62. ~wait_op() = default;
  63. private:
  64. asio::basic_socket_acceptor<protocol_type, executor> &acceptor_;
  65. wait_type wt_;
  66. };
  67. public:
  68. [[nodiscard]] accept_op accept(socket & sock)
  69. {
  70. return accept_op{acceptor_, sock};
  71. }
  72. template<protocol_type::family_t F = tcp.family(), protocol_type::protocol_t P = tcp.protocol()>
  73. [[nodiscard]] accept_stream_op accept(static_protocol<F, tcp.type(), P> stream_proto = tcp)
  74. {
  75. return accept_stream_op{acceptor_};
  76. }
  77. template<protocol_type::family_t F, protocol_type::protocol_t P>
  78. [[nodiscard]] accept_seq_packet_op accept(static_protocol<F, local_seqpacket.type(), P> stream_proto)
  79. {
  80. return accept_seq_packet_op{acceptor_};
  81. }
  82. [[nodiscard]] wait_op wait(wait_type wt = wait_type::wait_read)
  83. {
  84. return {acceptor_, wt};
  85. }
  86. private:
  87. asio::basic_socket_acceptor<protocol_type, executor> acceptor_;
  88. };
  89. }
  90. #endif //BOOST_COBALT_EXPERIMENTAL_IO_ACCEPTOR_HPP