Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-08-17 08:39:19

0001 //
0002 // Copyright (c) 2025 Klemens Morgenstern (klemens.morgenstern@gmx.net)
0003 //
0004 // Distributed under the Boost Software License, Version 1.0. (See accompanying
0005 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
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); // int backlog = net::max_backlog()
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 //BOOST_COBALT_EXPERIMENTAL_IO_ACCEPTOR_HPP