1  
//
1  
//
2  
// Copyright (c) 2026 Steve Gerbino
2  
// Copyright (c) 2026 Steve Gerbino
3  
//
3  
//
4  
// Distributed under the Boost Software License, Version 1.0. (See accompanying
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)
5  
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6  
//
6  
//
7  
// Official repository: https://github.com/cppalliance/corosio
7  
// Official repository: https://github.com/cppalliance/corosio
8  
//
8  
//
9  

9  

10  
#ifndef BOOST_COROSIO_DETAIL_ACCEPTOR_SERVICE_HPP
10  
#ifndef BOOST_COROSIO_DETAIL_ACCEPTOR_SERVICE_HPP
11  
#define BOOST_COROSIO_DETAIL_ACCEPTOR_SERVICE_HPP
11  
#define BOOST_COROSIO_DETAIL_ACCEPTOR_SERVICE_HPP
12  

12  

13  
#include <boost/corosio/detail/config.hpp>
13  
#include <boost/corosio/detail/config.hpp>
14  
#include <boost/corosio/tcp_acceptor.hpp>
14  
#include <boost/corosio/tcp_acceptor.hpp>
15  
#include <boost/corosio/endpoint.hpp>
15  
#include <boost/corosio/endpoint.hpp>
16  
#include <boost/capy/ex/execution_context.hpp>
16  
#include <boost/capy/ex/execution_context.hpp>
17  
#include <system_error>
17  
#include <system_error>
18  

18  

19  
namespace boost::corosio::detail {
19  
namespace boost::corosio::detail {
20  

20  

21  
/** Abstract acceptor service base class.
21  
/** Abstract acceptor service base class.
22  

22  

23  
    Concrete implementations ( epoll_acceptors, select_acceptors, etc. )
23  
    Concrete implementations ( epoll_acceptors, select_acceptors, etc. )
24  
    inherit from this class and provide platform-specific acceptor
24  
    inherit from this class and provide platform-specific acceptor
25  
    operations. The context constructor installs whichever backend
25  
    operations. The context constructor installs whichever backend
26  
    via `make_service`, and `tcp_acceptor.cpp` retrieves it via
26  
    via `make_service`, and `tcp_acceptor.cpp` retrieves it via
27  
    `use_service<acceptor_service>()`.
27  
    `use_service<acceptor_service>()`.
28  
*/
28  
*/
29  
class BOOST_COROSIO_DECL acceptor_service
29  
class BOOST_COROSIO_DECL acceptor_service
30  
    : public capy::execution_context::service
30  
    : public capy::execution_context::service
31  
    , public io_object::io_service
31  
    , public io_object::io_service
32  
{
32  
{
33  
public:
33  
public:
34  
    /// Identifies this service for `execution_context` lookup.
34  
    /// Identifies this service for `execution_context` lookup.
35  
    using key_type = acceptor_service;
35  
    using key_type = acceptor_service;
36  

36  

37 -
    /** Open an acceptor.
37 +
    /** Create the acceptor socket without binding or listening.
38  

38  

39 -
        Creates an IPv4 TCP socket, binds it to the specified endpoint,
39 +
        Creates a socket with dual-stack enabled for IPv6 but does
40 -
        and begins listening for incoming connections.
40 +
        not bind or listen. Does not set SO_REUSEADDR.
41  

41  

42  
        @param impl The acceptor implementation to open.
42  
        @param impl The acceptor implementation to open.
 
43 +
        @param family Address family (e.g. `AF_INET`, `AF_INET6`).
 
44 +
        @param type Socket type (e.g. `SOCK_STREAM`).
 
45 +
        @param protocol Protocol number (e.g. `IPPROTO_TCP`).
 
46 +
        @return Error code on failure, empty on success.
 
47 +
    */
 
48 +
    virtual std::error_code open_acceptor_socket(
 
49 +
        tcp_acceptor::implementation& impl,
 
50 +
        int family, int type, int protocol) = 0;
 
51 +

 
52 +
    /** Bind an open acceptor to a local endpoint.
 
53 +

 
54 +
        @param impl The acceptor implementation to bind.
43 -
        @param backlog The maximum length of the queue of pending connections.
 
44  
        @param ep The local endpoint to bind to.
55  
        @param ep The local endpoint to bind to.
45  
        @return Error code on failure, empty on success.
56  
        @return Error code on failure, empty on success.
46  
    */
57  
    */
47 -
    virtual std::error_code open_acceptor(
58 +
    virtual std::error_code bind_acceptor(
48 -
        tcp_acceptor::implementation& impl, endpoint ep, int backlog) = 0;
59 +
        tcp_acceptor::implementation& impl, endpoint ep) = 0;
 
60 +

 
61 +
    /** Start listening for incoming connections.
 
62 +

 
63 +
        Registers the acceptor with the platform reactor after
 
64 +
        calling `::listen()`.
 
65 +

 
66 +
        @param impl The acceptor implementation to listen on.
 
67 +
        @param backlog The maximum length of the pending connection queue.
 
68 +
        @return Error code on failure, empty on success.
 
69 +
    */
 
70 +
    virtual std::error_code listen_acceptor(
 
71 +
        tcp_acceptor::implementation& impl, int backlog) = 0;
49  

72  

50  
protected:
73  
protected:
51  
    /// Construct the acceptor service.
74  
    /// Construct the acceptor service.
52  
    acceptor_service() = default;
75  
    acceptor_service() = default;
53  

76  

54  
    /// Destroy the acceptor service.
77  
    /// Destroy the acceptor service.
55  
    ~acceptor_service() override = default;
78  
    ~acceptor_service() override = default;
56  
};
79  
};
57  

80  

58  
} // namespace boost::corosio::detail
81  
} // namespace boost::corosio::detail
59  

82  

60  
#endif // BOOST_COROSIO_DETAIL_ACCEPTOR_SERVICE_HPP
83  
#endif // BOOST_COROSIO_DETAIL_ACCEPTOR_SERVICE_HPP