File indexing completed on 2026-08-17 08:39:19
0001
0002
0003
0004
0005
0006
0007
0008 #ifndef BOOST_COBALT_EXPERIMENTAL_IO_ACCEPTOR_HPP
0009 #define BOOST_COBALT_EXPERIMENTAL_IO_ACCEPTOR_HPP
0010
0011
0012 #include <boost/cobalt/io/detail/config.hpp>
0013 #include <boost/cobalt/io/ops.hpp>
0014 #include <boost/cobalt/io/stream_socket.hpp>
0015 #include <boost/cobalt/io/seq_packet_socket.hpp>
0016 #include <boost/asio/basic_socket_acceptor.hpp>
0017
0018 namespace boost::cobalt::io
0019 {
0020
0021 struct BOOST_SYMBOL_VISIBLE acceptor
0022 {
0023 using wait_type = asio::socket_base::wait_type;
0024 constexpr static std::size_t max_listen_connections = asio::socket_base::max_listen_connections;
0025
0026 BOOST_COBALT_IO_DECL acceptor(const cobalt::executor & executor = this_thread::get_executor());
0027 BOOST_COBALT_IO_DECL acceptor(endpoint ep, const cobalt::executor & executor = this_thread::get_executor());
0028 BOOST_COBALT_IO_DECL system::result<void> bind(endpoint ep);
0029 BOOST_COBALT_IO_DECL system::result<void> listen(int backlog = max_listen_connections);
0030 BOOST_COBALT_IO_DECL endpoint local_endpoint();
0031 private:
0032 struct BOOST_COBALT_IO_DECL accept_op final : op<system::error_code>
0033 {
0034 void initiate(completion_handler<system::error_code> h) override;
0035
0036 accept_op(accept_op &&) noexcept = default;
0037 accept_op(asio::basic_socket_acceptor<protocol_type, executor> & acceptor, socket& sock)
0038 : acceptor_(acceptor), sock_(sock) {}
0039 ~accept_op() = default;
0040 protected:
0041 asio::basic_socket_acceptor<protocol_type, executor> &acceptor_;
0042 socket & sock_;
0043 };
0044
0045 struct BOOST_COBALT_IO_DECL accept_stream_op final : op<system::error_code, stream_socket>
0046 {
0047 void initiate(completion_handler<system::error_code, stream_socket> h) override;
0048
0049 accept_stream_op(accept_stream_op &&) noexcept = default;
0050 accept_stream_op(asio::basic_socket_acceptor<protocol_type, executor> & acceptor) : acceptor_(acceptor) {}
0051 ~accept_stream_op() = default;
0052 private:
0053 asio::basic_socket_acceptor<protocol_type, executor> &acceptor_;
0054 stream_socket sock_{acceptor_.get_executor()};
0055 };
0056
0057 struct BOOST_COBALT_IO_DECL accept_seq_packet_op final : op<system::error_code, seq_packet_socket>
0058 {
0059 void initiate(completion_handler<system::error_code, seq_packet_socket> h) override;
0060
0061 accept_seq_packet_op(accept_seq_packet_op &&) noexcept = default;
0062 accept_seq_packet_op(asio::basic_socket_acceptor<protocol_type, executor> & acceptor) : acceptor_(acceptor) {}
0063 ~accept_seq_packet_op() = default;
0064 private:
0065 asio::basic_socket_acceptor<protocol_type, executor> &acceptor_;
0066 seq_packet_socket sock_{acceptor_.get_executor()};
0067 };
0068
0069
0070 struct BOOST_COBALT_IO_DECL wait_op final : op<system::error_code>
0071 {
0072 void initiate(completion_handler<system::error_code> h) override;
0073
0074 wait_op(asio::basic_socket_acceptor<protocol_type, executor> & acceptor, wait_type wt)
0075 : acceptor_(acceptor), wt_(wt) {}
0076 ~wait_op() = default;
0077 private:
0078 asio::basic_socket_acceptor<protocol_type, executor> &acceptor_;
0079 wait_type wt_;
0080
0081 };
0082
0083
0084
0085 public:
0086 [[nodiscard]] accept_op accept(socket & sock)
0087 {
0088 return accept_op{acceptor_, sock};
0089 }
0090
0091 template<protocol_type::family_t F = tcp.family(), protocol_type::protocol_t P = tcp.protocol()>
0092 [[nodiscard]] accept_stream_op accept(static_protocol<F, tcp.type(), P> stream_proto = tcp)
0093 {
0094 return accept_stream_op{acceptor_};
0095 }
0096
0097 template<protocol_type::family_t F, protocol_type::protocol_t P>
0098 [[nodiscard]] accept_seq_packet_op accept(static_protocol<F, local_seqpacket.type(), P> stream_proto)
0099 {
0100 return accept_seq_packet_op{acceptor_};
0101 }
0102
0103
0104 [[nodiscard]] wait_op wait(wait_type wt = wait_type::wait_read)
0105 {
0106 return {acceptor_, wt};
0107 }
0108
0109 private:
0110
0111 asio::basic_socket_acceptor<protocol_type, executor> acceptor_;
0112 };
0113
0114 }
0115
0116 #endif